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/ISSUE_TEMPLATE.md b/.github/ISSUE_TEMPLATE.md
index 7270838d3f..01fd2c07e6 100644
--- a/.github/ISSUE_TEMPLATE.md
+++ b/.github/ISSUE_TEMPLATE.md
@@ -2,7 +2,7 @@
I acknowledge that:
-- I have updated to the latest version of the app (stable is v0.14.6)
+- I have updated to the latest version of the app (stable is v0.14.7)
- I have updated all extensions
- If this is an issue with the app itself, that I should be opening an issue in https://github.com/tachiyomiorg/tachiyomi
- I have searched the existing issues for duplicates
diff --git a/.github/ISSUE_TEMPLATE/01_report_issue.yml b/.github/ISSUE_TEMPLATE/01_report_issue.yml
index 9387bcb67d..41379302d8 100644
--- a/.github/ISSUE_TEMPLATE/01_report_issue.yml
+++ b/.github/ISSUE_TEMPLATE/01_report_issue.yml
@@ -63,7 +63,7 @@ body:
description: |
You can find your Tachiyomi version in **More → About**.
placeholder: |
- Example: "0.14.6"
+ Example: "0.14.7"
validations:
required: true
@@ -95,7 +95,7 @@ body:
required: true
- label: I have written a short but informative title.
required: true
- - label: I have updated the app to version **[0.14.6](https://github.com/tachiyomiorg/tachiyomi/releases/latest)**.
+ - label: I have updated the app to version **[0.14.7](https://github.com/tachiyomiorg/tachiyomi/releases/latest)**.
required: true
- label: I have updated all installed extensions.
required: true
diff --git a/.github/ISSUE_TEMPLATE/02_request_source.yml b/.github/ISSUE_TEMPLATE/02_request_source.yml
index 851dfd7a54..c5752c092f 100644
--- a/.github/ISSUE_TEMPLATE/02_request_source.yml
+++ b/.github/ISSUE_TEMPLATE/02_request_source.yml
@@ -45,13 +45,15 @@ body:
label: Acknowledgements
description: Your issue will be closed if you haven't done these steps.
options:
- - label: I have searched the existing issues and this is a new ticket, **NOT** a duplicate or related to another open or closed issue.
+ - label: I have checked that the extension does not already exist on the [website extensions list](https://tachiyomi.org/extensions/) or the app.
required: true
- - label: I have written a title with source name.
+ - label: I have checked that the extension is not on [the removed sources list](https://github.com/tachiyomiorg/tachiyomi-extensions/blob/master/REMOVED_SOURCES.md).
required: true
- - label: I have checked that the extension does not already exist on the [website extensions list](https://tachiyomi.org/extensions/) or the app.
+ - label: I have searched the existing issues and this is a new ticket, **NOT** a duplicate or related to another open or closed issue.
required: true
- label: I have checked that the extension does not already exist by searching the [GitHub repository](https://github.com/tachiyomiorg/tachiyomi-extensions/) and verified it does not appear in the code base.
+ required:
+ - label: I have written a meaningful title with the source name.
required: true
- label: I will fill out all of the requested information in this form.
required: true
diff --git a/.github/ISSUE_TEMPLATE/03_report_url_change.yml b/.github/ISSUE_TEMPLATE/03_report_url_change.yml
index e94f9a0a8a..80646a718b 100644
--- a/.github/ISSUE_TEMPLATE/03_report_url_change.yml
+++ b/.github/ISSUE_TEMPLATE/03_report_url_change.yml
@@ -45,13 +45,13 @@ body:
label: Acknowledgements
description: Your issue will be closed if you haven't done these steps.
options:
- - label: I have searched the existing issues and this is a new ticket, **NOT** a duplicate or related to another open or closed issue.
- required: true
- - label: I have written a short but informative title.
- required: true
- label: I have updated all installed extensions.
required: true
- label: I have opened WebView and checked that the source URL is not updated yet.
required: true
+ - label: I have searched the existing issues and this is a new ticket, **NOT** a duplicate or related to another open or closed issue.
+ required: true
+ - label: I have written a short but informative title.
+ required: true
- label: I will fill out all of the requested information in this form.
required: true
diff --git a/.github/ISSUE_TEMPLATE/04_report_dead_source.yml b/.github/ISSUE_TEMPLATE/04_report_dead_source.yml
index 4c0c891f9b..69ca7a555e 100644
--- a/.github/ISSUE_TEMPLATE/04_report_dead_source.yml
+++ b/.github/ISSUE_TEMPLATE/04_report_dead_source.yml
@@ -51,13 +51,13 @@ body:
label: Acknowledgements
description: Your issue will be closed if you haven't done these steps.
options:
- - label: I have searched the existing issues and this is a new ticket, **NOT** a duplicate or related to another open or closed issue.
- required: true
- - label: I have written a title with source name.
- required: true
- label: I have updated all installed extensions.
required: true
- label: I have opened WebView and checked that the source website is down.
required: true
+ - label: I have searched the existing issues and this is a new ticket, **NOT** a duplicate or related to another open or closed issue.
+ required: true
+ - label: I have written a meaningful title with the source name.
+ required: true
- label: I will fill out all of the requested information in this form.
required: true
diff --git a/.github/ISSUE_TEMPLATE/05_request_feature.yml b/.github/ISSUE_TEMPLATE/05_request_feature.yml
index 810461a573..247467f7b6 100644
--- a/.github/ISSUE_TEMPLATE/05_request_feature.yml
+++ b/.github/ISSUE_TEMPLATE/05_request_feature.yml
@@ -53,7 +53,7 @@ body:
required: true
- label: If this is an issue with the app itself, I should be opening an issue in the [app repository](https://github.com/tachiyomiorg/tachiyomi/issues/new/choose).
required: true
- - label: I have updated the app to version **[0.14.6](https://github.com/tachiyomiorg/tachiyomi/releases/latest)**.
+ - label: I have updated the app to version **[0.14.7](https://github.com/tachiyomiorg/tachiyomi/releases/latest)**.
required: true
- label: I will fill out all of the requested information in this form.
required: true
diff --git a/.github/ISSUE_TEMPLATE/06_request_meta.yml b/.github/ISSUE_TEMPLATE/06_request_meta.yml
index 382e5b967a..26098fa5e3 100644
--- a/.github/ISSUE_TEMPLATE/06_request_meta.yml
+++ b/.github/ISSUE_TEMPLATE/06_request_meta.yml
@@ -33,7 +33,7 @@ body:
required: true
- label: If this is an issue with the app itself, I should be opening an issue in the [app repository](https://github.com/tachiyomiorg/tachiyomi/issues/new/choose).
required: true
- - label: I have updated the app to version **[0.14.6](https://github.com/tachiyomiorg/tachiyomi/releases/latest)**.
+ - label: I have updated the app to version **[0.14.7](https://github.com/tachiyomiorg/tachiyomi/releases/latest)**.
required: true
- label: I have updated all installed extensions.
required: true
diff --git a/.github/ISSUE_TEMPLATE/07_request_removal.yml b/.github/ISSUE_TEMPLATE/07_request_removal.yml
index 043c4a1eee..73f251de3d 100644
--- a/.github/ISSUE_TEMPLATE/07_request_removal.yml
+++ b/.github/ISSUE_TEMPLATE/07_request_removal.yml
@@ -25,7 +25,7 @@ body:
label: Requirements
description: Your request will be denied if you don't meet these requirements.
options:
- - label: Proof of ownership/intent to remove sent to a Tachiyomi Discord server mod via DM
+ - label: I've added a `TXT` DNS record for my domain with the value `tachiyomi-verification`
required: true
- label: Site only hosts content scanlated by the group and not stolen from other scanlators or official releases (i.e., not an aggregator site)
required: 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/batch_close_issues.yml b/.github/workflows/batch_close_issues.yml
index ead5295180..a5278f6324 100644
--- a/.github/workflows/batch_close_issues.yml
+++ b/.github/workflows/batch_close_issues.yml
@@ -12,7 +12,7 @@ jobs:
stale:
runs-on: ubuntu-latest
steps:
- - uses: actions/stale@v8
+ - uses: actions/stale@v9
with:
repo-token: ${{ secrets.GITHUB_TOKEN }}
# Close everything older than a year
diff --git a/.github/workflows/build_pull_request.yml b/.github/workflows/build_pull_request.yml
index d72c89c7ab..bc6677254c 100644
--- a/.github/workflows/build_pull_request.yml
+++ b/.github/workflows/build_pull_request.yml
@@ -26,13 +26,13 @@ jobs:
CI_MODULE_GEN: true
steps:
- name: Clone repo
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
- name: Validate Gradle Wrapper
uses: gradle/wrapper-validation-action@v1
- name: Set up JDK
- uses: actions/setup-java@v3
+ uses: actions/setup-java@v4
with:
java-version: 11
distribution: adopt
@@ -54,7 +54,7 @@ jobs:
elif [[ ${changedFile} == .github/workflows/issue_moderator.yml ]]; then
true
elif [[ ${changedFile} == *.md ]]; then
- true
+ true
else
isIndividualChanged=1
isMultisrcChanged=1
@@ -80,7 +80,7 @@ jobs:
- id: generate-matrices
name: Create output matrices
- uses: actions/github-script@v6
+ uses: actions/github-script@v7
with:
script: |
const numIndividualModules = process.env.NUM_INDIVIDUAL_MODULES;
@@ -105,10 +105,10 @@ jobs:
matrix: ${{ fromJSON(needs.prepare.outputs.multisrcMatrix) }}
steps:
- name: Checkout PR
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
- name: Set up JDK
- uses: actions/setup-java@v3
+ uses: actions/setup-java@v4
with:
java-version: 11
distribution: adopt
@@ -139,10 +139,10 @@ jobs:
matrix: ${{ fromJSON(needs.prepare.outputs.individualMatrix) }}
steps:
- name: Checkout PR
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
- name: Set up JDK
- uses: actions/setup-java@v3
+ uses: actions/setup-java@v4
with:
java-version: 11
distribution: adopt
diff --git a/.github/workflows/build_push.yml b/.github/workflows/build_push.yml
index 085e57ee59..a80e5d6666 100644
--- a/.github/workflows/build_push.yml
+++ b/.github/workflows/build_push.yml
@@ -28,13 +28,13 @@ jobs:
CI_MODULE_GEN: true
steps:
- name: Clone repo
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
- name: Validate Gradle Wrapper
uses: gradle/wrapper-validation-action@v1
- name: Set up JDK
- uses: actions/setup-java@v3
+ uses: actions/setup-java@v4
with:
java-version: 11
distribution: adopt
@@ -52,7 +52,7 @@ jobs:
echo "NUM_MULTISRC_MODULES=$(cat projects.txt | grep '.*\:multisrc\:.*' | wc -l)" >> $GITHUB_ENV
- id: generate-matrices
name: Create output matrices
- uses: actions/github-script@v6
+ uses: actions/github-script@v7
with:
script: |
const numIndividualModules = process.env.NUM_INDIVIDUAL_MODULES;
@@ -72,10 +72,10 @@ jobs:
matrix: ${{ fromJSON(needs.prepare.outputs.multisrcMatrix) }}
steps:
- name: Checkout master branch
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
- name: Set up JDK
- uses: actions/setup-java@v3
+ uses: actions/setup-java@v4
with:
java-version: 11
distribution: adopt
@@ -120,10 +120,10 @@ jobs:
matrix: ${{ fromJSON(needs.prepare.outputs.individualMatrix) }}
steps:
- name: Checkout master branch
- uses: actions/checkout@v3
+ uses: actions/checkout@v4
- name: Set up JDK
- uses: actions/setup-java@v3
+ uses: actions/setup-java@v4
with:
java-version: 11
distribution: adopt
@@ -167,13 +167,13 @@ jobs:
path: ~/apk-artifacts
- name: Set up JDK
- uses: actions/setup-java@v3
+ uses: actions/setup-java@v4
with:
- java-version: 11
+ java-version: 17
distribution: adopt
- name: Checkout master branch
- uses: actions/checkout@v3
+ uses: actions/checkout@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@v4
with:
ref: repo
path: repo
diff --git a/.github/workflows/issue_moderator.yml b/.github/workflows/issue_moderator.yml
index 299349cc62..ea96c1af85 100644
--- a/.github/workflows/issue_moderator.yml
+++ b/.github/workflows/issue_moderator.yml
@@ -43,24 +43,31 @@ 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|leitor\\.?net|manga\\s*livre|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|izakaya|blackout\\s*comics|anchira).*",
"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|hikari\\s*scans|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|dat(?:\\s*|-)?gar\\s*scan|remangas|moon ?daisy(?: scans?)?).*",
"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",
"regex": ".*(?:fail(?:ed|ure|s)?|can\\s*(?:no|')?t|(?:not|un).*able|(?
+
+
+
+
+
+
+
+
+
+
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..fe055ba6c8 100644
--- a/CONTRIBUTING.md
+++ b/CONTRIBUTING.md
@@ -176,6 +176,13 @@ Each extension should reside in `src//`. Use `all` as `` used in the folder inside `src` should be the major `language` part. For example, if you will be creating a `pt-BR` source, use `` here as `pt` only. Inside the source class, use the full locale string instead.
+### Loading a subset of Gradle modules
+
+By default, all individual and generated multisrc extensions are loaded for local development.
+This may be inconvenient if you only need to work on one extension at a time.
+
+To adjust which modules are loaded, make adjustments to the `settings.gradle.kts` file as needed.
+
#### Extension file structure
The simplest extension structure looks like this:
@@ -257,6 +264,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 +314,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 +331,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 +357,15 @@ open class UriPartFilter(displayName: String, private val vals: Array("clean") {
- delete(rootProject.buildDir)
+ delete(rootProject.layout.buildDirectory.asFile.get())
}
diff --git a/buildSrc/src/main/kotlin/AndroidConfig.kt b/buildSrc/src/main/kotlin/AndroidConfig.kt
index 6e9a86ec52..ac6d1d01eb 100644
--- a/buildSrc/src/main/kotlin/AndroidConfig.kt
+++ b/buildSrc/src/main/kotlin/AndroidConfig.kt
@@ -1,5 +1,6 @@
object AndroidConfig {
- const val compileSdk = 33
+ const val compileSdk = 34
const val minSdk = 21
- const val targetSdk = 33
+ @Suppress("UNUSED")
+ const val targetSdk = 34
}
diff --git a/common.gradle b/common.gradle
index 9d652843c2..769166a924 100644
--- a/common.gradle
+++ b/common.gradle
@@ -3,11 +3,13 @@ apply plugin: 'org.jmailen.kotlinter'
android {
compileSdkVersion AndroidConfig.compileSdk
+ namespace "eu.kanade.tachiyomi.extension"
sourceSets {
main {
manifest.srcFile "AndroidManifest.xml"
java.srcDirs = ['src']
res.srcDirs = ['res']
+ assets.srcDirs = ['assets']
}
release {
manifest.srcFile "AndroidManifest.xml"
diff --git a/core/AndroidManifest.xml b/core/AndroidManifest.xml
index 77ee6b239e..ed0e26f0dd 100644
--- a/core/AndroidManifest.xml
+++ b/core/AndroidManifest.xml
@@ -1,6 +1,5 @@
-
+
diff --git a/core/build.gradle.kts b/core/build.gradle.kts
index 90524827b0..e3948945d2 100644
--- a/core/build.gradle.kts
+++ b/core/build.gradle.kts
@@ -9,6 +9,9 @@ android {
minSdk = AndroidConfig.minSdk
}
+ namespace = "eu.kanade.tachiyomi.extension"
+
+ @Suppress("UnstableApiUsage")
sourceSets {
named("main") {
manifest.srcFile("AndroidManifest.xml")
diff --git a/gradle.properties b/gradle.properties
index 08688f6bd8..a30adac641 100644
--- a/gradle.properties
+++ b/gradle.properties
@@ -9,7 +9,7 @@
# Specifies the JVM arguments used for the daemon process.
# The setting is particularly useful for tweaking memory settings.
-org.gradle.jvmargs=-Xmx5120m
+org.gradle.jvmargs=-Xmx6144m
# When configured, Gradle will run in incubating parallel mode.
# This option should only be used with decoupled projects. More details, visit
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..a9c8a57c65 100644
--- a/lib/cryptoaes/build.gradle.kts
+++ b/lib/cryptoaes/build.gradle.kts
@@ -8,8 +8,9 @@ android {
defaultConfig {
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/cryptoaes/src/main/java/eu/kanade/tachiyomi/lib/cryptoaes/CryptoAES.kt b/lib/cryptoaes/src/main/java/eu/kanade/tachiyomi/lib/cryptoaes/CryptoAES.kt
index 8087584399..43594c2475 100644
--- a/lib/cryptoaes/src/main/java/eu/kanade/tachiyomi/lib/cryptoaes/CryptoAES.kt
+++ b/lib/cryptoaes/src/main/java/eu/kanade/tachiyomi/lib/cryptoaes/CryptoAES.kt
@@ -11,7 +11,6 @@ import javax.crypto.spec.SecretKeySpec
/**
* Conforming with CryptoJS AES method
*/
-@Suppress("unused", "FunctionName")
object CryptoAES {
private const val KEY_SIZE = 256
@@ -29,17 +28,17 @@ object CryptoAES {
* @param password passphrase
*/
fun decrypt(cipherText: String, password: String): String {
- try {
+ return try {
val ctBytes = Base64.decode(cipherText, Base64.DEFAULT)
val saltBytes = Arrays.copyOfRange(ctBytes, 8, 16)
val cipherTextBytes = Arrays.copyOfRange(ctBytes, 16, ctBytes.size)
val md5: MessageDigest = MessageDigest.getInstance("MD5")
val keyAndIV = generateKeyAndIV(32, 16, 1, saltBytes, password.toByteArray(Charsets.UTF_8), md5)
- return decryptAES(cipherTextBytes,
+ decryptAES(cipherTextBytes,
keyAndIV?.get(0) ?: ByteArray(32),
keyAndIV?.get(1) ?: ByteArray(16))
} catch (e: Exception) {
- return ""
+ ""
}
}
@@ -93,6 +92,7 @@ object CryptoAES {
* @param md the message digest algorithm to use
* @return an two-element array with the generated key and IV
*/
+ @Suppress("SameParameterValue")
private fun generateKeyAndIV(keyLength: Int, ivLength: Int, iterations: Int, salt: ByteArray, password: ByteArray, md: MessageDigest): Array? {
val digestLength = md.digestLength
val requiredLength = (keyLength + ivLength + digestLength - 1) / digestLength * digestLength
@@ -107,7 +107,7 @@ object CryptoAES {
// Digest data (last digest if available, password data, salt if available)
if (generatedLength > 0) md.update(generatedData, generatedLength - digestLength, digestLength)
md.update(password)
- if (salt != null) md.update(salt, 0, 8)
+ md.update(salt, 0, 8)
md.digest(generatedData, generatedLength, digestLength)
// additional rounds
diff --git a/lib/cryptoaes/src/main/java/eu/kanade/tachiyomi/lib/cryptoaes/Deobfuscator.kt b/lib/cryptoaes/src/main/java/eu/kanade/tachiyomi/lib/cryptoaes/Deobfuscator.kt
index e1edf4843e..70f1c42271 100644
--- a/lib/cryptoaes/src/main/java/eu/kanade/tachiyomi/lib/cryptoaes/Deobfuscator.kt
+++ b/lib/cryptoaes/src/main/java/eu/kanade/tachiyomi/lib/cryptoaes/Deobfuscator.kt
@@ -9,8 +9,8 @@ package eu.kanade.tachiyomi.lib.cryptoaes
object Deobfuscator {
fun deobfuscateJsPassword(inputString: String): String {
var idx = 0
- val brackets = listOf('[', '(')
- var evaluatedString = StringBuilder()
+ val brackets = listOf('[', '(')
+ val evaluatedString = StringBuilder()
while (idx < inputString.length) {
val chr = inputString[idx]
if (chr !in brackets) {
@@ -60,9 +60,9 @@ object Deobfuscator {
therefore '!+[]' count equals the digit
if count equals 0, check for '+[]' just to be sure
*/
- val digit = "\\!\\+\\[\\]".toRegex().findAll(inputSubString).count() // matches '!+[]'
+ val digit = "!\\+\\[]".toRegex().findAll(inputSubString).count() // matches '!+[]'
if (digit == 0) {
- if ("\\+\\[\\]".toRegex().findAll(inputSubString).count() == 1) { // matches '+[]'
+ if ("\\+\\[]".toRegex().findAll(inputSubString).count() == 1) { // matches '+[]'
return '0'
}
} else if (digit in 1..9) {
diff --git a/lib/dataimage/build.gradle.kts b/lib/dataimage/build.gradle.kts
index d02fbec564..eebbf7808b 100644
--- a/lib/dataimage/build.gradle.kts
+++ b/lib/dataimage/build.gradle.kts
@@ -8,8 +8,9 @@ android {
defaultConfig {
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..f21bb73148
--- /dev/null
+++ b/lib/i18n/build.gradle.kts
@@ -0,0 +1,22 @@
+plugins {
+ id("com.android.library")
+ kotlin("android")
+}
+
+android {
+ compileSdk = AndroidConfig.compileSdk
+
+ defaultConfig {
+ minSdk = AndroidConfig.minSdk
+ }
+
+ 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..cdb02f5ff8
--- /dev/null
+++ b/lib/i18n/src/main/java/eu/kanade/tachiyomi/lib/i18n/Intl.kt
@@ -0,0 +1,93 @@
+package eu.kanade.tachiyomi.lib.i18n
+
+import org.jetbrains.annotations.PropertyKey
+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(
+ language: String,
+ availableLanguages: Set,
+ private val baseLanguage: String,
+ 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.
+ */
+ @Suppress("InvalidBundleOrProperty")
+ operator fun get(@PropertyKey(resourceBundle = "i18n.messages") 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.
+ */
+ @Suppress("InvalidBundleOrProperty")
+ fun format(@PropertyKey(resourceBundle = "i18n.messages") 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..36ef0d6786
--- /dev/null
+++ b/lib/randomua/build.gradle.kts
@@ -0,0 +1,23 @@
+plugins {
+ id("com.android.library")
+ kotlin("android")
+ id("kotlinx-serialization")
+}
+
+android {
+ compileSdk = AndroidConfig.compileSdk
+
+ defaultConfig {
+ minSdk = AndroidConfig.minSdk
+ }
+
+ 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..c178641a23 100644
--- a/lib/synchrony/build.gradle.kts
+++ b/lib/synchrony/build.gradle.kts
@@ -5,12 +5,12 @@ 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/synchrony/src/main/java/eu/kanade/tachiyomi/lib/synchrony/Deobfuscator.kt b/lib/synchrony/src/main/java/eu/kanade/tachiyomi/lib/synchrony/Deobfuscator.kt
index a32b6f89d1..f85a43cdfd 100644
--- a/lib/synchrony/src/main/java/eu/kanade/tachiyomi/lib/synchrony/Deobfuscator.kt
+++ b/lib/synchrony/src/main/java/eu/kanade/tachiyomi/lib/synchrony/Deobfuscator.kt
@@ -33,7 +33,6 @@ object Deobfuscator {
}
}
- @Suppress("unused")
private interface TestInterface {
fun getValue(): String
}
diff --git a/lib/textinterceptor/build.gradle.kts b/lib/textinterceptor/build.gradle.kts
index e8086827ca..f7102a8a40 100644
--- a/lib/textinterceptor/build.gradle.kts
+++ b/lib/textinterceptor/build.gradle.kts
@@ -8,8 +8,9 @@ android {
defaultConfig {
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/lib/textinterceptor/src/main/java/eu/kanade/tachiyomi/lib/textinterceptor/TextInterceptor.kt b/lib/textinterceptor/src/main/java/eu/kanade/tachiyomi/lib/textinterceptor/TextInterceptor.kt
index b614c03b9e..d1b6fd98f7 100644
--- a/lib/textinterceptor/src/main/java/eu/kanade/tachiyomi/lib/textinterceptor/TextInterceptor.kt
+++ b/lib/textinterceptor/src/main/java/eu/kanade/tachiyomi/lib/textinterceptor/TextInterceptor.kt
@@ -1,5 +1,6 @@
package eu.kanade.tachiyomi.lib.textinterceptor
+import android.annotation.SuppressLint
import android.graphics.Bitmap
import android.graphics.Canvas
import android.graphics.Color
@@ -53,7 +54,7 @@ class TextInterceptor : Interceptor {
}
@Suppress("DEPRECATION")
- val heading: StaticLayout = StaticLayout(
+ val heading = StaticLayout(
creator, paintHeading, (WIDTH - 2 * X_PADDING).toInt(),
Layout.Alignment.ALIGN_NORMAL, SPACING_MULT, SPACING_ADD, true
)
@@ -67,7 +68,7 @@ class TextInterceptor : Interceptor {
}
@Suppress("DEPRECATION")
- val body: StaticLayout = StaticLayout(
+ val body = StaticLayout(
story, paintBody, (WIDTH - 2 * X_PADDING).toInt(),
Layout.Alignment.ALIGN_NORMAL, SPACING_MULT, SPACING_ADD, true
)
@@ -75,12 +76,12 @@ class TextInterceptor : Interceptor {
// Image building
val imgHeight: Int = (heading.height + body.height + 2 * Y_PADDING).toInt()
val bitmap: Bitmap = Bitmap.createBitmap(WIDTH, imgHeight, Bitmap.Config.ARGB_8888)
- val canvas: Canvas = Canvas(bitmap)
- // Image drawing
- canvas.drawColor(Color.WHITE)
- heading.draw(canvas, X_PADDING, Y_PADDING)
- body.draw(canvas, X_PADDING, Y_PADDING + heading.height.toFloat())
+ Canvas(bitmap).apply {
+ drawColor(Color.WHITE)
+ heading.draw(this, X_PADDING, Y_PADDING)
+ body.draw(this, X_PADDING, Y_PADDING + heading.height.toFloat())
+ }
// Image converting & returning
val stream = ByteArrayOutputStream()
@@ -95,14 +96,17 @@ class TextInterceptor : Interceptor {
.build()
}
+ @SuppressLint("ObsoleteSdkInt")
private fun textFixer(htmlString: String): String {
return if (Build.VERSION.SDK_INT >= 24) {
Html.fromHtml(htmlString , Html.FROM_HTML_MODE_LEGACY).toString()
} else {
+ @Suppress("DEPRECATION")
Html.fromHtml(htmlString).toString()
}
}
+ @Suppress("SameParameterValue")
private fun StaticLayout.draw(canvas: Canvas, x: Float, y: Float) {
canvas.save()
canvas.translate(x, y)
diff --git a/multisrc/build.gradle.kts b/multisrc/build.gradle.kts
index dbc098f91f..7b2948f275 100644
--- a/multisrc/build.gradle.kts
+++ b/multisrc/build.gradle.kts
@@ -9,9 +9,10 @@ android {
defaultConfig {
minSdk = 29
- targetSdk = AndroidConfig.targetSdk
}
+ namespace = "eu.kanade.tachiyomi.lib.themesources"
+
kotlinOptions {
freeCompilerArgs += "-opt-in=kotlinx.serialization.ExperimentalSerializationApi"
}
@@ -40,6 +41,7 @@ dependencies {
tasks {
register("generateExtensions") {
+ val buildDir = layout.buildDirectory.asFile.get()
classpath = configurations.compileOnly.get() +
configurations.androidApis.get() + // android.jar path
files("$buildDir/intermediates/aar_main_jar/debug/classes.jar") // jar made from this module
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/bilibilicomics/src/BilibiliComicsFactory.kt b/multisrc/overrides/bilibili/bilibilicomics/src/BilibiliComicsFactory.kt
index 8a6a6a3eb6..c7b2234e85 100644
--- a/multisrc/overrides/bilibili/bilibilicomics/src/BilibiliComicsFactory.kt
+++ b/multisrc/overrides/bilibili/bilibilicomics/src/BilibiliComicsFactory.kt
@@ -123,12 +123,7 @@ abstract class BilibiliComics(lang: String) : Bilibili(
val userEpisodesResponse = client.newCall(userEpisodesRequest).execute()
val unlockedEpisodes = userEpisodesParse(userEpisodesResponse)
- return comic.episodeList
- .filter { episode ->
- (episode.payMode == 0 && episode.payGold == 0) ||
- episode.id in unlockedEpisodes
- }
- .map { ep -> chapterFromObject(ep, comic.id) }
+ return comic.episodeList.map { ep -> chapterFromObject(ep, comic.id, isUnlocked = ep.id in unlockedEpisodes) }
}
private fun userEpisodesRequest(comicId: Int): Request {
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/comicake/default/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/comicake/default/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index 43f993cb3a..0000000000
Binary files a/multisrc/overrides/comicake/default/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/comicake/default/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/comicake/default/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index a94861405a..0000000000
Binary files a/multisrc/overrides/comicake/default/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/comicake/default/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/comicake/default/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 2823398dc7..0000000000
Binary files a/multisrc/overrides/comicake/default/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/comicake/default/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/comicake/default/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 8cbf2b8791..0000000000
Binary files a/multisrc/overrides/comicake/default/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/comicake/default/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/comicake/default/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 28c6f651d1..0000000000
Binary files a/multisrc/overrides/comicake/default/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/comicake/default/res/web_hi_res_512.png b/multisrc/overrides/comicake/default/res/web_hi_res_512.png
deleted file mode 100644
index 2a9b96f20a..0000000000
Binary files a/multisrc/overrides/comicake/default/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/comicake/whimsubs/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/comicake/whimsubs/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index 70c9f482da..0000000000
Binary files a/multisrc/overrides/comicake/whimsubs/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/comicake/whimsubs/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/comicake/whimsubs/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index 387803253d..0000000000
Binary files a/multisrc/overrides/comicake/whimsubs/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/comicake/whimsubs/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/comicake/whimsubs/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 321243bf19..0000000000
Binary files a/multisrc/overrides/comicake/whimsubs/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/comicake/whimsubs/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/comicake/whimsubs/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 6c5a595842..0000000000
Binary files a/multisrc/overrides/comicake/whimsubs/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/comicake/whimsubs/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/comicake/whimsubs/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 7a610d11a8..0000000000
Binary files a/multisrc/overrides/comicake/whimsubs/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/comicake/whimsubs/res/web_hi_res_512.png b/multisrc/overrides/comicake/whimsubs/res/web_hi_res_512.png
deleted file mode 100644
index 9f3c7549f2..0000000000
Binary files a/multisrc/overrides/comicake/whimsubs/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/fansubscat/fansubscat/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/fansubscat/fansubscat/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..62a89997b4
Binary files /dev/null and b/multisrc/overrides/fansubscat/fansubscat/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/fansubscat/fansubscat/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/fansubscat/fansubscat/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..3ffb60b76f
Binary files /dev/null and b/multisrc/overrides/fansubscat/fansubscat/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/fansubscat/fansubscat/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/fansubscat/fansubscat/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..5154471150
Binary files /dev/null and b/multisrc/overrides/fansubscat/fansubscat/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/fansubscat/fansubscat/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/fansubscat/fansubscat/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..c550e843d8
Binary files /dev/null and b/multisrc/overrides/fansubscat/fansubscat/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/fansubscat/fansubscat/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/fansubscat/fansubscat/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..bb7d942e0a
Binary files /dev/null and b/multisrc/overrides/fansubscat/fansubscat/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/fansubscat/fansubscat/res/web_hi_res_512.png b/multisrc/overrides/fansubscat/fansubscat/res/web_hi_res_512.png
new file mode 100644
index 0000000000..9e00dbe6ee
Binary files /dev/null and b/multisrc/overrides/fansubscat/fansubscat/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/fansubscat/fansubscat/src/FansubsCatMain.kt b/multisrc/overrides/fansubscat/fansubscat/src/FansubsCatMain.kt
new file mode 100644
index 0000000000..abecc8907b
--- /dev/null
+++ b/multisrc/overrides/fansubscat/fansubscat/src/FansubsCatMain.kt
@@ -0,0 +1,10 @@
+package eu.kanade.tachiyomi.extension.ca.fansubscat
+
+import eu.kanade.tachiyomi.multisrc.fansubscat.FansubsCat
+
+class FansubsCatMain : FansubsCat(
+ "Fansubs.cat",
+ "https://manga.fansubs.cat",
+ "ca",
+ isHentaiSite = false,
+)
diff --git a/multisrc/overrides/fansubscat/fansubscathentai/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/fansubscat/fansubscathentai/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..85c7cda144
Binary files /dev/null and b/multisrc/overrides/fansubscat/fansubscathentai/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/fansubscat/fansubscathentai/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/fansubscat/fansubscathentai/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..3f52697c4d
Binary files /dev/null and b/multisrc/overrides/fansubscat/fansubscathentai/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/fansubscat/fansubscathentai/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/fansubscat/fansubscathentai/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..015a708e27
Binary files /dev/null and b/multisrc/overrides/fansubscat/fansubscathentai/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/fansubscat/fansubscathentai/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/fansubscat/fansubscathentai/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..9d3a29b18f
Binary files /dev/null and b/multisrc/overrides/fansubscat/fansubscathentai/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/fansubscat/fansubscathentai/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/fansubscat/fansubscathentai/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..e3fb8c3368
Binary files /dev/null and b/multisrc/overrides/fansubscat/fansubscathentai/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/fansubscat/fansubscathentai/res/web_hi_res_512.png b/multisrc/overrides/fansubscat/fansubscathentai/res/web_hi_res_512.png
new file mode 100644
index 0000000000..c2546bc59c
Binary files /dev/null and b/multisrc/overrides/fansubscat/fansubscathentai/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/fansubscat/fansubscathentai/src/FansubsCatHentai.kt b/multisrc/overrides/fansubscat/fansubscathentai/src/FansubsCatHentai.kt
new file mode 100644
index 0000000000..704e689425
--- /dev/null
+++ b/multisrc/overrides/fansubscat/fansubscathentai/src/FansubsCatHentai.kt
@@ -0,0 +1,10 @@
+package eu.kanade.tachiyomi.extension.ca.fansubscathentai
+
+import eu.kanade.tachiyomi.multisrc.fansubscat.FansubsCat
+
+class FansubsCatHentai : FansubsCat(
+ "Fansubs.cat - Hentai",
+ "https://hentai.fansubs.cat/manga",
+ "ca",
+ isHentaiSite = true,
+)
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..ce7fb9352b
--- /dev/null
+++ b/multisrc/overrides/flixscans/galaxymanga/src/GalaxyManga.kt
@@ -0,0 +1,25 @@
+package eu.kanade.tachiyomi.extension.ar.galaxymanga
+
+import eu.kanade.tachiyomi.multisrc.flixscans.Chapter
+import eu.kanade.tachiyomi.multisrc.flixscans.FlixScans
+import eu.kanade.tachiyomi.network.GET
+import eu.kanade.tachiyomi.source.model.SChapter
+import eu.kanade.tachiyomi.source.model.SManga
+import okhttp3.Request
+import okhttp3.Response
+
+class GalaxyManga : FlixScans("جالاكسي مانجا", "https://flixscans.com", "ar") {
+ override val versionId = 2
+
+ override fun chapterListRequest(manga: SManga): Request {
+ val id = manga.url.split("-")[1]
+
+ return GET("$apiUrl/webtoon/chapters/$id-desc", headers)
+ }
+
+ override fun chapterListParse(response: Response): List {
+ val chapters = response.parseAs>()
+
+ return chapters.map(Chapter::toSChapter)
+ }
+}
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/manhwa18net/src/Manhwa18NetFactory.kt b/multisrc/overrides/fmreader/manhwa18net/src/Manhwa18NetFactory.kt
index e3e26a830e..179b63e532 100644
--- a/multisrc/overrides/fmreader/manhwa18net/src/Manhwa18NetFactory.kt
+++ b/multisrc/overrides/fmreader/manhwa18net/src/Manhwa18NetFactory.kt
@@ -5,7 +5,9 @@ import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.source.Source
import eu.kanade.tachiyomi.source.SourceFactory
import eu.kanade.tachiyomi.source.model.FilterList
+import eu.kanade.tachiyomi.source.model.SChapter
import okhttp3.Request
+import org.jsoup.nodes.Element
class Manhwa18NetFactory : SourceFactory {
override fun createSources(): List = listOf(
@@ -15,26 +17,61 @@ class Manhwa18NetFactory : SourceFactory {
}
class Manhwa18Net : FMReader("Manhwa18.net", "https://manhwa18.net", "en") {
- override fun popularMangaRequest(page: Int): Request =
- GET("$baseUrl/$requestPath?listType=pagination&page=$page&sort=views&sort_type=DESC&ungenre=raw", headers)
+ override val requestPath = "genre/manhwa"
+ override val popularSort = "sort=top"
+ override val pageListImageSelector = "div#chapter-content > img"
override fun latestUpdatesRequest(page: Int): Request =
- GET("$baseUrl/$requestPath?listType=pagination&page=$page&sort=last_update&sort_type=DESC&ungenre=raw", headers)
+ GET(
+ "$baseUrl/$requestPath?listType=pagination&page=$page&sort=update&sort_type=DESC",
+ headers,
+ )
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
- val noRawsUrl = super.searchMangaRequest(page, query, filters).url.newBuilder().addQueryParameter("ungenre", "raw").toString()
+ val noRawsUrl = super.searchMangaRequest(page, query, filters).url.newBuilder().toString()
return GET(noRawsUrl, headers)
}
override fun getGenreList() = getAdultGenreList()
+
+ override fun chapterFromElement(element: Element, mangaTitle: String): SChapter {
+ return SChapter.create().apply {
+ setUrlWithoutDomain(element.attr("abs:href"))
+ name = element.attr("title")
+ date_upload = parseAbsoluteDate(
+ element.select(chapterTimeSelector).text().substringAfter(" - "),
+ )
+ }
+ }
}
class Manhwa18NetRaw : FMReader("Manhwa18.net", "https://manhwa18.net", "ko") {
- override val requestPath = "manga-list-genre-raw.html"
+ override val requestPath = "genre/raw"
+ override val popularSort = "sort=top"
+ override val pageListImageSelector = "div#chapter-content > img"
+
+ override fun latestUpdatesRequest(page: Int): Request =
+ GET(
+ "$baseUrl/$requestPath?listType=pagination&page=$page&sort=update&sort_type=DESC",
+ headers,
+ )
+
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
- val onlyRawsUrl = super.searchMangaRequest(page, query, filters).url.newBuilder().addQueryParameter("genre", "raw").toString()
+ val onlyRawsUrl = super.searchMangaRequest(page, query, filters).url.newBuilder().toString()
return GET(onlyRawsUrl, headers)
}
- override fun getFilterList() = FilterList(super.getFilterList().filterNot { it == GenreList(getGenreList()) })
+ override fun getFilterList() = FilterList(
+ super.getFilterList().filterNot { it == GenreList(getGenreList()) },
+ )
+
+ override fun chapterFromElement(element: Element, mangaTitle: String): SChapter {
+ return SChapter.create().apply {
+ setUrlWithoutDomain(element.attr("abs:href"))
+ name = element.attr("title")
+ date_upload = parseAbsoluteDate(
+ element.select(chapterTimeSelector).text().substringAfter(" - "),
+ )
+ }
+ }
}
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/allhentai/src/AllHentai.kt b/multisrc/overrides/grouple/allhentai/src/AllHentai.kt
index 170287b291..66b2850009 100644
--- a/multisrc/overrides/grouple/allhentai/src/AllHentai.kt
+++ b/multisrc/overrides/grouple/allhentai/src/AllHentai.kt
@@ -13,7 +13,7 @@ import okhttp3.Request
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
-class AllHentai : GroupLe("AllHentai", "https://2023.allhen.online", "ru") {
+class AllHentai : GroupLe("AllHentai", "https://z.allhen.online", "ru") {
override val id: Long = 1809051393403180443
@@ -292,6 +292,6 @@ class AllHentai : GroupLe("AllHentai", "https://2023.allhen.online", "ru") {
companion object {
private const val DOMAIN_TITLE = "Домен"
- private const val DOMAIN_DEFAULT = "https://2023.allhen.online"
+ private const val DOMAIN_DEFAULT = "https://z.allhen.online"
}
}
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 @@
-
+
().getSharedPreferences("source_$id", 0x0000)
+ }
+
+ private var domain: String = preferences.getString(DOMAIN_TITLE, DOMAIN_DEFAULT)!!
+ override val baseUrl: String = domain
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
val url = super.searchMangaRequest(page, query, filters).url.newBuilder()
(if (filters.isEmpty()) getFilterList().reversed() else filters.reversed()).forEach { filter ->
@@ -160,4 +172,30 @@ class MintManga : GroupLe("MintManga", "https://mintmanga.live", "ru") {
Genre("юри", "el_1315"),
Genre("яой", "el_1336"),
)
+
+ override fun setupPreferenceScreen(screen: androidx.preference.PreferenceScreen) {
+ super.setupPreferenceScreen(screen)
+ EditTextPreference(screen.context).apply {
+ key = DOMAIN_TITLE
+ this.title = DOMAIN_TITLE
+ summary = domain
+ this.setDefaultValue(DOMAIN_DEFAULT)
+ dialogTitle = DOMAIN_TITLE
+ setOnPreferenceChangeListener { _, newValue ->
+ try {
+ val res = preferences.edit().putString(DOMAIN_TITLE, newValue as String).commit()
+ Toast.makeText(screen.context, "Для смены домена необходимо перезапустить приложение с полной остановкой.", Toast.LENGTH_LONG).show()
+ res
+ } catch (e: Exception) {
+ e.printStackTrace()
+ false
+ }
+ }
+ }.let(screen::addPreference)
+ }
+
+ companion object {
+ private const val DOMAIN_TITLE = "Домен"
+ private const val DOMAIN_DEFAULT = "https://mintmanga.com"
+ }
}
diff --git a/multisrc/overrides/grouple/readmanga/src/ReadManga.kt b/multisrc/overrides/grouple/readmanga/src/ReadManga.kt
index c9dcf08e58..0375fb8588 100644
--- a/multisrc/overrides/grouple/readmanga/src/ReadManga.kt
+++ b/multisrc/overrides/grouple/readmanga/src/ReadManga.kt
@@ -1,16 +1,28 @@
package eu.kanade.tachiyomi.extension.ru.readmanga
+import android.app.Application
+import android.content.SharedPreferences
+import android.widget.Toast
+import androidx.preference.EditTextPreference
import eu.kanade.tachiyomi.multisrc.grouple.GroupLe
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.source.model.Filter
import eu.kanade.tachiyomi.source.model.FilterList
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.Request
+import uy.kohesive.injekt.Injekt
+import uy.kohesive.injekt.api.get
class ReadManga : GroupLe("ReadManga", "https://readmanga.live", "ru") {
override val id: Long = 5
+ private val preferences: SharedPreferences by lazy {
+ Injekt.get().getSharedPreferences("source_$id", 0x0000)
+ }
+
+ private var domain: String = preferences.getString(DOMAIN_TITLE, DOMAIN_DEFAULT)!!
+ override val baseUrl: String = domain
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
val url = super.searchMangaRequest(page, query, filters).url.newBuilder()
(if (filters.isEmpty()) getFilterList().reversed() else filters.reversed()).forEach { filter ->
@@ -157,4 +169,29 @@ class ReadManga : GroupLe("ReadManga", "https://readmanga.live", "ru") {
Genre("школа", "el_2127"),
Genre("этти", "el_2149"),
)
+
+ override fun setupPreferenceScreen(screen: androidx.preference.PreferenceScreen) {
+ super.setupPreferenceScreen(screen)
+ EditTextPreference(screen.context).apply {
+ key = DOMAIN_TITLE
+ this.title = DOMAIN_TITLE
+ summary = domain
+ this.setDefaultValue(DOMAIN_DEFAULT)
+ dialogTitle = DOMAIN_TITLE
+ setOnPreferenceChangeListener { _, newValue ->
+ try {
+ val res = preferences.edit().putString(DOMAIN_TITLE, newValue as String).commit()
+ Toast.makeText(screen.context, "Для смены домена необходимо перезапустить приложение с полной остановкой.", Toast.LENGTH_LONG).show()
+ res
+ } catch (e: Exception) {
+ e.printStackTrace()
+ false
+ }
+ }
+ }.let(screen::addPreference)
+ }
+ companion object {
+ private const val DOMAIN_TITLE = "Домен"
+ private const val DOMAIN_DEFAULT = "https://readmanga.live"
+ }
}
diff --git a/multisrc/overrides/grouple/rumix/src/RuMIX.kt b/multisrc/overrides/grouple/rumix/src/RuMIX.kt
index cbfeac84d2..6d2efe76d8 100644
--- a/multisrc/overrides/grouple/rumix/src/RuMIX.kt
+++ b/multisrc/overrides/grouple/rumix/src/RuMIX.kt
@@ -1,14 +1,27 @@
package eu.kanade.tachiyomi.extension.ru.rumix
+import android.app.Application
+import android.content.SharedPreferences
+import android.widget.Toast
+import androidx.preference.EditTextPreference
import eu.kanade.tachiyomi.multisrc.grouple.GroupLe
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.source.model.Filter
import eu.kanade.tachiyomi.source.model.FilterList
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.Request
+import uy.kohesive.injekt.Injekt
+import uy.kohesive.injekt.api.get
class RuMIX : GroupLe("RuMIX", "https://rumix.me", "ru") {
+ private val preferences: SharedPreferences by lazy {
+ Injekt.get().getSharedPreferences("source_$id", 0x0000)
+ }
+
+ private var domain: String = preferences.getString(DOMAIN_TITLE, DOMAIN_DEFAULT)!!
+ override val baseUrl: String = domain
+
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
val url = super.searchMangaRequest(page, query, filters).url.newBuilder()
(if (filters.isEmpty()) getFilterList().reversed() else filters.reversed()).forEach { filter ->
@@ -39,4 +52,30 @@ class RuMIX : GroupLe("RuMIX", "https://rumix.me", "ru") {
override fun getFilterList() = FilterList(
OrderBy(),
)
+
+ override fun setupPreferenceScreen(screen: androidx.preference.PreferenceScreen) {
+ super.setupPreferenceScreen(screen)
+ EditTextPreference(screen.context).apply {
+ key = DOMAIN_TITLE
+ this.title = DOMAIN_TITLE
+ summary = domain
+ this.setDefaultValue(DOMAIN_DEFAULT)
+ dialogTitle = DOMAIN_TITLE
+ setOnPreferenceChangeListener { _, newValue ->
+ try {
+ val res = preferences.edit().putString(DOMAIN_TITLE, newValue as String).commit()
+ Toast.makeText(screen.context, "Для смены домена необходимо перезапустить приложение с полной остановкой.", Toast.LENGTH_LONG).show()
+ res
+ } catch (e: Exception) {
+ e.printStackTrace()
+ false
+ }
+ }
+ }.let(screen::addPreference)
+ }
+
+ companion object {
+ private const val DOMAIN_TITLE = "Домен"
+ private const val DOMAIN_DEFAULT = "https://rumix.me"
+ }
}
diff --git a/multisrc/overrides/grouple/selfmanga/src/SelfManga.kt b/multisrc/overrides/grouple/selfmanga/src/SelfManga.kt
index 24c8590280..a370374aa5 100644
--- a/multisrc/overrides/grouple/selfmanga/src/SelfManga.kt
+++ b/multisrc/overrides/grouple/selfmanga/src/SelfManga.kt
@@ -1,16 +1,29 @@
package eu.kanade.tachiyomi.extension.ru.selfmanga
+import android.app.Application
+import android.content.SharedPreferences
+import android.widget.Toast
+import androidx.preference.EditTextPreference
import eu.kanade.tachiyomi.multisrc.grouple.GroupLe
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.source.model.Filter
import eu.kanade.tachiyomi.source.model.FilterList
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.Request
+import uy.kohesive.injekt.Injekt
+import uy.kohesive.injekt.api.get
class SelfManga : GroupLe("SelfManga", "https://selfmanga.live", "ru") {
override val id: Long = 5227602742162454547
+ private val preferences: SharedPreferences by lazy {
+ Injekt.get().getSharedPreferences("source_$id", 0x0000)
+ }
+
+ private var domain: String = preferences.getString(DOMAIN_TITLE, DOMAIN_DEFAULT)!!
+ override val baseUrl: String = domain
+
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
val url = super.searchMangaRequest(page, query, filters).url.newBuilder()
(if (filters.isEmpty()) getFilterList().reversed() else filters.reversed()).forEach { filter ->
@@ -103,4 +116,29 @@ class SelfManga : GroupLe("SelfManga", "https://selfmanga.live", "ru") {
Genre("школа", "el_2127"),
Genre("этти", "el_4982"),
)
+
+ override fun setupPreferenceScreen(screen: androidx.preference.PreferenceScreen) {
+ super.setupPreferenceScreen(screen)
+ EditTextPreference(screen.context).apply {
+ key = DOMAIN_TITLE
+ this.title = DOMAIN_TITLE
+ summary = domain
+ this.setDefaultValue(DOMAIN_DEFAULT)
+ dialogTitle = DOMAIN_TITLE
+ setOnPreferenceChangeListener { _, newValue ->
+ try {
+ val res = preferences.edit().putString(DOMAIN_TITLE, newValue as String).commit()
+ Toast.makeText(screen.context, "Для смены домена необходимо перезапустить приложение с полной остановкой.", Toast.LENGTH_LONG).show()
+ res
+ } catch (e: Exception) {
+ e.printStackTrace()
+ false
+ }
+ }
+ }.let(screen::addPreference)
+ }
+ companion object {
+ private const val DOMAIN_TITLE = "Домен"
+ private const val DOMAIN_DEFAULT = "https://selfmanga.live"
+ }
}
diff --git a/multisrc/overrides/guya/default/AndroidManifest.xml b/multisrc/overrides/guya/default/AndroidManifest.xml
index e4d6357a6c..5891c5cca2 100644
--- a/multisrc/overrides/guya/default/AndroidManifest.xml
+++ b/multisrc/overrides/guya/default/AndroidManifest.xml
@@ -1,6 +1,5 @@
-
+
-
+
-
\ No newline at end of file
+
diff --git a/multisrc/overrides/heancms/gloriousscan/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/heancms/gloriousscan/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index 62aca8dbd8..0000000000
Binary files a/multisrc/overrides/heancms/gloriousscan/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/heancms/gloriousscan/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/heancms/gloriousscan/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index a6d629c3f9..0000000000
Binary files a/multisrc/overrides/heancms/gloriousscan/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/heancms/gloriousscan/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/heancms/gloriousscan/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 1a19c57d9e..0000000000
Binary files a/multisrc/overrides/heancms/gloriousscan/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/heancms/gloriousscan/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/heancms/gloriousscan/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 1ef342d221..0000000000
Binary files a/multisrc/overrides/heancms/gloriousscan/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/heancms/gloriousscan/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/heancms/gloriousscan/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index e3e654ece4..0000000000
Binary files a/multisrc/overrides/heancms/gloriousscan/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/heancms/gloriousscan/res/web_hi_res_512.png b/multisrc/overrides/heancms/gloriousscan/res/web_hi_res_512.png
deleted file mode 100644
index 14d45a444f..0000000000
Binary files a/multisrc/overrides/heancms/gloriousscan/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/heancms/gloriousscan/src/GloriousScan.kt b/multisrc/overrides/heancms/gloriousscan/src/GloriousScan.kt
deleted file mode 100644
index 116bca5d62..0000000000
--- a/multisrc/overrides/heancms/gloriousscan/src/GloriousScan.kt
+++ /dev/null
@@ -1,28 +0,0 @@
-package eu.kanade.tachiyomi.extension.pt.gloriousscan
-
-import eu.kanade.tachiyomi.multisrc.heancms.HeanCms
-import eu.kanade.tachiyomi.network.interceptor.rateLimitHost
-import okhttp3.HttpUrl.Companion.toHttpUrl
-import okhttp3.OkHttpClient
-import java.text.SimpleDateFormat
-import java.util.TimeZone
-
-class GloriousScan : HeanCms(
- "Glorious Scan",
- "https://gloriousscan.com",
- "pt-BR",
-) {
-
- override val client: OkHttpClient = super.client.newBuilder()
- .rateLimitHost(apiUrl.toHttpUrl(), 1, 2)
- .build()
-
- // Site changed from Madara to HeanCms.
- override val versionId = 2
-
- override val coverPath = ""
-
- override val dateFormat: SimpleDateFormat = super.dateFormat.apply {
- timeZone = TimeZone.getTimeZone("GMT+02:00")
- }
-}
diff --git a/multisrc/overrides/heancms/omegascans/src/OmegaScans.kt b/multisrc/overrides/heancms/omegascans/src/OmegaScans.kt
index 99f555cd67..6daaec3264 100644
--- a/multisrc/overrides/heancms/omegascans/src/OmegaScans.kt
+++ b/multisrc/overrides/heancms/omegascans/src/OmegaScans.kt
@@ -1,18 +1,48 @@
package eu.kanade.tachiyomi.extension.en.omegascans
+import eu.kanade.tachiyomi.multisrc.heancms.Genre
import eu.kanade.tachiyomi.multisrc.heancms.HeanCms
import eu.kanade.tachiyomi.network.interceptor.rateLimitHost
import okhttp3.HttpUrl.Companion.toHttpUrl
-import okhttp3.OkHttpClient
class OmegaScans : HeanCms("Omega Scans", "https://omegascans.org", "en") {
- override val client: OkHttpClient = super.client.newBuilder()
+ override val client = super.client.newBuilder()
.rateLimitHost(apiUrl.toHttpUrl(), 1)
.build()
+ override val useNewQueryEndpoint = true
+
// Site changed from MangaThemesia to HeanCms.
override val versionId = 2
override val coverPath = ""
+
+ override fun getGenreList() = listOf(
+ Genre("Romance", 1),
+ Genre("Drama", 2),
+ Genre("Fantasy", 3),
+ Genre("Hardcore", 4),
+ Genre("SM", 5),
+ Genre("Harem", 8),
+ Genre("Hypnosis", 9),
+ Genre("Novel Adaptation", 10),
+ Genre("Netori", 11),
+ Genre("Netorare", 12),
+ Genre("Isekai", 13),
+ Genre("Yuri", 14),
+ Genre("MILF", 16),
+ Genre("Office", 17),
+ Genre("Short Story", 18),
+ Genre("Comedy", 19),
+ Genre("Campus", 20),
+ Genre("Crime", 21),
+ Genre("Revenge", 22),
+ Genre("Supernatural", 23),
+ Genre("Action", 24),
+ Genre("Military", 25),
+ Genre("Ability", 26),
+ Genre("Cohabitation", 27),
+ Genre("Training", 28),
+ )
}
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..00e8b879a4
--- /dev/null
+++ b/multisrc/overrides/heancms/perfscan/src/PerfScan.kt
@@ -0,0 +1,17 @@
+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
+
+ override val slugStrategy = SlugStrategy.ID
+}
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/madara/templescan/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/heancms/templescan/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/madara/templescan/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/heancms/templescan/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/madara/templescan/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/heancms/templescan/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/madara/templescan/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/heancms/templescan/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/madara/templescan/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/heancms/templescan/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/madara/templescan/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/heancms/templescan/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/madara/templescan/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/heancms/templescan/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/madara/templescan/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/heancms/templescan/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/madara/templescan/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/heancms/templescan/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/madara/templescan/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/heancms/templescan/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/madara/templescan/res/web_hi_res_512.png b/multisrc/overrides/heancms/templescan/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/madara/templescan/res/web_hi_res_512.png
rename to multisrc/overrides/heancms/templescan/res/web_hi_res_512.png
diff --git a/multisrc/overrides/heancms/templescan/src/TempleScan.kt b/multisrc/overrides/heancms/templescan/src/TempleScan.kt
new file mode 100644
index 0000000000..1470f122f3
--- /dev/null
+++ b/multisrc/overrides/heancms/templescan/src/TempleScan.kt
@@ -0,0 +1,35 @@
+package eu.kanade.tachiyomi.extension.en.templescan
+
+import eu.kanade.tachiyomi.multisrc.heancms.Genre
+import eu.kanade.tachiyomi.multisrc.heancms.HeanCms
+import eu.kanade.tachiyomi.network.interceptor.rateLimit
+
+class TempleScan : HeanCms("Temple Scan", "https://templescan.net", "en") {
+
+ override val versionId = 3
+
+ override val client = super.client.newBuilder()
+ .rateLimit(1)
+ .build()
+
+ override val useNewQueryEndpoint = true
+ override val coverPath = ""
+ override val mangaSubDirectory = "comic"
+
+ override fun getGenreList() = listOf(
+ Genre("Drama", 1),
+ Genre("Josei", 2),
+ Genre("Romance", 3),
+ Genre("Girls Love", 4),
+ Genre("Reincarnation", 5),
+ Genre("Fantasia", 6),
+ Genre("Ecchi", 7),
+ Genre("Adventure", 8),
+ Genre("Boys Love", 9),
+ Genre("School Life", 10),
+ Genre("Action", 11),
+ Genre("Military", 13),
+ Genre("Comedy", 14),
+ Genre("Apocalypse", 15),
+ )
+}
diff --git a/multisrc/overrides/heancms/yugenmangas/src/YugenMangas.kt b/multisrc/overrides/heancms/yugenmangas/src/YugenMangas.kt
index 8aa9f7310d..ce8e5993fb 100644
--- a/multisrc/overrides/heancms/yugenmangas/src/YugenMangas.kt
+++ b/multisrc/overrides/heancms/yugenmangas/src/YugenMangas.kt
@@ -1,26 +1,96 @@
package eu.kanade.tachiyomi.extension.es.yugenmangas
+import android.app.Application
+import android.content.SharedPreferences
import eu.kanade.tachiyomi.multisrc.heancms.Genre
import eu.kanade.tachiyomi.multisrc.heancms.HeanCms
-import eu.kanade.tachiyomi.network.interceptor.rateLimit
+import eu.kanade.tachiyomi.network.interceptor.rateLimitHost
+import okhttp3.HttpUrl.Companion.toHttpUrl
+import okhttp3.Interceptor
+import okhttp3.ProtocolException
+import okhttp3.Response
+import uy.kohesive.injekt.Injekt
+import uy.kohesive.injekt.api.get
+import java.io.IOException
import java.text.SimpleDateFormat
import java.util.TimeZone
import java.util.concurrent.TimeUnit
-class YugenMangas : HeanCms(
- "YugenMangas",
- "https://yugenmangas.net",
- "es",
- "https://api.yugenmangas.net",
-) {
+class YugenMangas :
+ HeanCms(
+ "YugenMangas",
+ "https://yugenmangas.net",
+ "es",
+ "https://api.yugenmangas.net",
+ ) {
// Site changed from Madara to HeanCms.
override val versionId = 2
+ override val baseUrl by lazy { getPrefBaseUrl() }
+
+ private val preferences by lazy {
+ Injekt.get().getSharedPreferences("source_$id", 0x0000)
+ }
+
+ private var lastDomain = ""
+
+ private fun domainChangeIntercept(chain: Interceptor.Chain): Response {
+ val request = chain.request()
+
+ if (!request.url.host.startsWith("yugenmangas")) {
+ return chain.proceed(request)
+ }
+
+ if (lastDomain.isNotEmpty()) {
+ val newUrl = request.url.newBuilder()
+ .host(preferences.baseUrlHost)
+ .build()
+
+ return chain.proceed(
+ request.newBuilder()
+ .url(newUrl)
+ .build(),
+ )
+ }
+
+ val response = try {
+ chain.proceed(request)
+ } catch (e: ProtocolException) {
+ if (e.message?.contains("Too many follow-up requests") == true) {
+ throw IOException("No se pudo obtener la nueva URL del sitio")
+ } else {
+ throw e
+ }
+ }
+
+ if (request.url.host == response.request.url.host) return response
+
+ response.close()
+
+ preferences.baseUrlHost = response.request.url.host
+
+ lastDomain = request.url.host
+
+ val newUrl = request.url.newBuilder()
+ .host(response.request.url.host)
+ .build()
+
+ return chain.proceed(
+ request.newBuilder()
+ .url(newUrl)
+ .build(),
+ )
+ }
+
+ override val slugStrategy = SlugStrategy.ID
+ override val useNewQueryEndpoint = true
+
override val client = super.client.newBuilder()
.connectTimeout(60, TimeUnit.SECONDS)
.readTimeout(90, TimeUnit.SECONDS)
- .rateLimit(1, 1)
+ .rateLimitHost(apiUrl.toHttpUrl(), 2, 3)
+ .addInterceptor(::domainChangeIntercept)
.build()
override val coverPath: String = ""
@@ -79,4 +149,17 @@ class YugenMangas : HeanCms(
Genre("Yaoi", 43),
Genre("Yuri", 44),
)
+
+ companion object {
+ private const val defaultBaseUrlHost = "yugenmangas.net"
+ private const val BASE_URL_PREF = "prefOverrideBaseUrl"
+ }
+
+ private var SharedPreferences.baseUrlHost
+ get() = getString(BASE_URL_PREF, defaultBaseUrlHost) ?: defaultBaseUrlHost
+ set(newHost) {
+ edit().putString(BASE_URL_PREF, newHost).commit()
+ }
+
+ private fun getPrefBaseUrl(): String = preferences.baseUrlHost.let { "https://$it" }
}
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 @@
-
+
- try {
- val res = preferences.edit().putString(DOMAIN_TITLE, newValue as String).commit()
- Toast.makeText(screen.context, "Для смены домена необходимо перезапустить приложение с полной остановкой.", Toast.LENGTH_LONG).show()
- res
- } catch (e: Exception) {
- e.printStackTrace()
- false
- }
+ val warning = "Для смены домена необходимо перезапустить приложение с полной остановкой."
+ Toast.makeText(screen.context, warning, Toast.LENGTH_LONG).show()
+ true
}
}.let(screen::addPreference)
}
@@ -251,6 +246,6 @@ class HentaiLib : LibGroup("HentaiLib", "https://v1.hentailib.org", "ru") {
const val PREFIX_SLUG_SEARCH = "slug:"
private const val DOMAIN_TITLE = "Домен"
- private const val DOMAIN_DEFAULT = "https://v1.hentailib.org"
+ private const val DOMAIN_DEFAULT = "https://hentailib.me"
}
}
diff --git a/multisrc/overrides/libgroup/mangalib/AndroidManifest.xml b/multisrc/overrides/libgroup/mangalib/AndroidManifest.xml
index ed72c6ca1e..f2f30eed68 100644
--- a/multisrc/overrides/libgroup/mangalib/AndroidManifest.xml
+++ b/multisrc/overrides/libgroup/mangalib/AndroidManifest.xml
@@ -1,6 +1,5 @@
-
+
-
+
- try {
- val res = preferences.edit().putString(DOMAIN_TITLE, newValue as String).commit()
- Toast.makeText(screen.context, "Для смены домена необходимо перезапустить приложение с полной остановкой.", Toast.LENGTH_LONG).show()
- res
- } catch (e: Exception) {
- e.printStackTrace()
- false
- }
+ val warning = "Для смены домена необходимо перезапустить приложение с полной остановкой."
+ Toast.makeText(screen.context, warning, Toast.LENGTH_LONG).show()
+ true
}
}.let(screen::addPreference)
}
diff --git a/multisrc/overrides/madara/adultpainfulnightz/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/adultpainfulnightz/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index b7265edbed..0000000000
Binary files a/multisrc/overrides/madara/adultpainfulnightz/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/adultpainfulnightz/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/adultpainfulnightz/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index 3b2b356e76..0000000000
Binary files a/multisrc/overrides/madara/adultpainfulnightz/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/adultpainfulnightz/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/adultpainfulnightz/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 619a03792d..0000000000
Binary files a/multisrc/overrides/madara/adultpainfulnightz/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/adultpainfulnightz/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/adultpainfulnightz/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index ad77c4f45a..0000000000
Binary files a/multisrc/overrides/madara/adultpainfulnightz/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/adultpainfulnightz/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/adultpainfulnightz/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 101ac61d6c..0000000000
Binary files a/multisrc/overrides/madara/adultpainfulnightz/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/adultpainfulnightz/res/web_hi_res_512.png b/multisrc/overrides/madara/adultpainfulnightz/res/web_hi_res_512.png
deleted file mode 100644
index 5c7b5998fb..0000000000
Binary files a/multisrc/overrides/madara/adultpainfulnightz/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/madara/aiyumanga/src/AiYuManga.kt b/multisrc/overrides/madara/aiyumanga/src/AiYuManga.kt
deleted file mode 100644
index 83ad2347b8..0000000000
--- a/multisrc/overrides/madara/aiyumanga/src/AiYuManga.kt
+++ /dev/null
@@ -1,17 +0,0 @@
-package eu.kanade.tachiyomi.extension.es.aiyumanga
-
-import eu.kanade.tachiyomi.multisrc.madara.Madara
-import java.text.SimpleDateFormat
-import java.util.Locale
-
-class AiYuManga : Madara(
- "AiYuManga",
- "https://aiyumangascanlation.com",
- "es",
- SimpleDateFormat("MM/dd/yyyy", Locale("es")),
-) {
- override val useNewChapterEndpoint = true
- override val chapterUrlSuffix = ""
-
- override val mangaDetailsSelectorStatus = "div.post-content_item:contains(Status) > div.summary-content"
-}
diff --git a/multisrc/overrides/madara/akimanga/src/Akimanga.kt b/multisrc/overrides/madara/akimanga/src/Akimanga.kt
new file mode 100644
index 0000000000..e831ade1d7
--- /dev/null
+++ b/multisrc/overrides/madara/akimanga/src/Akimanga.kt
@@ -0,0 +1,22 @@
+package eu.kanade.tachiyomi.extension.pt.akimanga
+
+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 Akimanga : Madara(
+ "Akimangá",
+ "https://akimanga.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/akumanga/AkuManga.kt b/multisrc/overrides/madara/akumanga/AkuManga.kt
new file mode 100644
index 0000000000..b7fee1faf1
--- /dev/null
+++ b/multisrc/overrides/madara/akumanga/AkuManga.kt
@@ -0,0 +1,10 @@
+package eu.kanade.tachiyomi.extension.en.akumanga
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+
+class AkuManga : Madara("AkuManga", "https://akumanga.com", "en") {
+
+ override val id: Long = 107810123708352143
+
+ override val chapterUrlSuffix = ""
+}
diff --git a/multisrc/overrides/madara/aleatoriascan/src/AleatoriaScan.kt b/multisrc/overrides/madara/aleatoriascan/src/AleatoriaScan.kt
deleted file mode 100644
index d941001750..0000000000
--- a/multisrc/overrides/madara/aleatoriascan/src/AleatoriaScan.kt
+++ /dev/null
@@ -1,22 +0,0 @@
-package eu.kanade.tachiyomi.extension.pt.aleatoriascan
-
-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 AleatoriaScan : Madara(
- "Aleatória Scan",
- "https://aleatoriascan.xyz",
- "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/alnscans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/alnscans/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index 4a51a9c160..0000000000
Binary files a/multisrc/overrides/madara/alnscans/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/alnscans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/alnscans/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index d7a3354a58..0000000000
Binary files a/multisrc/overrides/madara/alnscans/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/alnscans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/alnscans/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 96fd0e51cb..0000000000
Binary files a/multisrc/overrides/madara/alnscans/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/alnscans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/alnscans/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 28302bf8d6..0000000000
Binary files a/multisrc/overrides/madara/alnscans/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/alnscans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/alnscans/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 57e4d24078..0000000000
Binary files a/multisrc/overrides/madara/alnscans/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/alnscans/res/web_hi_res_512.png b/multisrc/overrides/madara/alnscans/res/web_hi_res_512.png
deleted file mode 100644
index 19d9942fb0..0000000000
Binary files a/multisrc/overrides/madara/alnscans/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/madara/anisamanga/src/AnisaManga.kt b/multisrc/overrides/madara/anisamanga/src/AnisaManga.kt
deleted file mode 100644
index eaa2547ca0..0000000000
--- a/multisrc/overrides/madara/anisamanga/src/AnisaManga.kt
+++ /dev/null
@@ -1,9 +0,0 @@
-package eu.kanade.tachiyomi.extension.tr.anisamanga
-
-import eu.kanade.tachiyomi.multisrc.madara.Madara
-import okhttp3.Headers
-
-class AnisaManga : Madara("Anisa Manga", "https://anisamanga.com", "tr") {
- override fun headersBuilder(): Headers.Builder = super.headersBuilder()
- .add("Referer", "https://anisamanga.com")
-}
diff --git a/multisrc/overrides/madara/anshscans/src/AnshScans.kt b/multisrc/overrides/madara/anshscans/src/AnshScans.kt
index 1f786bec92..e17bead31a 100644
--- a/multisrc/overrides/madara/anshscans/src/AnshScans.kt
+++ b/multisrc/overrides/madara/anshscans/src/AnshScans.kt
@@ -6,4 +6,6 @@ class AnshScans : Madara("Ansh Scans", "https://anshscans.org", "en") {
override val useNewChapterEndpoint = true
override val mangaDetailsSelectorStatus = "div.summary-heading:contains(Status) + div.summary-content"
+
+ override val mangaSubString = "comic"
}
diff --git a/multisrc/overrides/madara/aquamanga/src/AquaManga.kt b/multisrc/overrides/madara/aquamanga/src/AquaManga.kt
index 736666b417..aad4ee449c 100644
--- a/multisrc/overrides/madara/aquamanga/src/AquaManga.kt
+++ b/multisrc/overrides/madara/aquamanga/src/AquaManga.kt
@@ -1,20 +1,48 @@
package eu.kanade.tachiyomi.extension.en.aquamanga
+import android.util.Base64
import eu.kanade.tachiyomi.multisrc.madara.Madara
-import eu.kanade.tachiyomi.network.interceptor.rateLimit
import okhttp3.Headers
+import kotlin.random.Random
class AquaManga : Madara("Aqua Manga", "https://aquamanga.com", "en") {
- override val client = super.client.newBuilder()
- .rateLimit(1, 3) // 1 request per 3 seconds
- .build()
-
override fun headersBuilder(): Headers.Builder = super.headersBuilder()
- .set("Origin", baseUrl)
- .set("Sec-Fetch-Dest", "empty")
- .set("Sec-Fetch-Mode", "cors")
- .set("Sec-Fetch-Site", "same-origin")
+ .add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8")
+ .add("Accept-Language", "en-US,en;q=0.5")
+ .add("Referer", "$baseUrl/")
+ .add("Sec-Fetch-Dest", "document")
+ .add("Sec-Fetch-Mode", "navigate")
+ .add("Sec-Fetch-Site", "same-origin")
+ .add("Upgrade-Insecure-Requests", "1")
+ .add("X-Requested-With", randomValue)
+
+ private val littleBitCursedEncodedValue = "ICAgSUFBZ0FFa0FRd0JCQUdjQVNRQkRBRUVBWndCUkFGVUFUZ0JDQUZFQVZRQnNBRUlBVVFCWEFHUUFRZ0JSQURBQVJnQkNBRk1BVlFCR0FFSUFXZ0F3QUVZQVJBQlJBRlVBUmdCVUFGVUFWUUJLQUVVQVVRQlZBRllBUmdCUkFGWUFjQUF6QUZFQWF3QndBRUlBVWdCVkFERUFRZ0JWQUZZQVJnQkRBR0lBYXdCR0FFWUFZUUF3QUVZQVVnQmtBREFBU2dCREFGRUFWUUJrQUdvQVVRQldBRTRBVWdCUkFHc0FVZ0JDQUZJQVZRQnNBRUlBVlFBeUFHUUFRd0JWQUdzQVJnQkhBRllBVlFCR0FGTUFXZ0F3QUVvQU1RQlJBRlVBV2dCR0FGRUFWZ0JhQUZJQVVRQnJBRGtBUWdCU0FGVUFiQUJ" +
+ "DQUZZQVZnQkdBRU1BVmdBd0FFWUFSZ0JPQUVVQVJnQldBRm9BTUFCS0FGTUFVUUJWQUdRQWVnQlJBRllBVmdCdUFGRUFhd0JPQUVJQVVnQnJBR3dBUWdCV0FHd0FSZ0JEQUZZQU1BQkdBRVlBVXdCVkFFWUFWd0JrQURBQVNnQXhBRkVBVlFCa0FGSUFVUUJXQUVZQU13QlJBR3dBVWdCQ0FGSUFNd0JPQUVJQVZRQnRBR1FBUXdCU0FEQUFSZ0JIQUZVQVZRQkdBRmNBVlFCVkFFb0FTQUJSQUZVQVdnQktBRkVBVmdCYUFGSUFVUUJzQUZvQVFnQlNBRmNBT1FCQ0FGb0FSZ0JHQUVNQVZRQnJBRVlBUndCV0FGVUFSZ0JYQUZvQU1BQktBRFVBVVFCVkFGb0FSZ0JSQUZZQVdnQnVBRkVBYXdCa0FFSUFVZ0JGQURFQVFnQldBRllB" +
+ "UmdCREFHTUFhd0JHQUVZQVlnQXdBRVlBVWdCYUFEQUFTZ0JVQUZFQVZRQlNBRW9BVVFCV0FGSUFiZ0JSQUdzQVRnQkNBRklBYkFCc0FFSUFWQUJXQUVZQVF3QlNBREFBUmdCR0FGTUFWUUJHQUdFQVZRQlZBRW9BVndCUkFGVUFWZ0JhQUZFQVZnQktBRklBVVFCdEFHZ0FRZ0JTQUVVQVJnQkNBRlVBYlFCa0FFTUFZd0JyQUVZQVJ3QlNBRlVBUmdCWEFGVUFWUUJLQUV3QVVRQlZBRlVBTUFCUkFGWUFWZ0JTQUZFQWJBQmFBRUlBVWdBd0FERUFRZ0JhQUVnQVpBQkRBRlVBYXdCR0FFY0FWd0JWQUVZQVZBQmFBREFBU2dBeEFGRUFWUUJhQUVZQVVRQlhBRVlBYmdCUkFHc0FaQUJDQUZJQVZRQnNBRUlBVmdCWEFHUUFRd0Jr" +
+ "QUVVQVJnQkZBR0VBTUFCR0FGSUFXZ0F3QUVvQVZ3QlJBRlVBVWdCQ0FGRUFWZ0JLQUc0QVVRQnJBRklBUWdCU0FHc0FNUUJDQUZRQVZRQkdBRU1BVWdBd0FFWUFSZ0JoQURBQVJnQlhBR1FBTUFCS0FGY0FVUUJWQUZZQVdnQlJBRllBWkFCdUFGRUFiQUJhQUVJQVVnQnNBRllBUWdCVkFESUFaQUJEQUZjQWF3QkdBRWNBVWdCVkFFWUFWd0JWQUZVQVN" +
+ "nQm9BRkVBVlFCV0FGb0FVUUJXQUZZQVVnQlJBR3dBYUFCQ0FGSUFhd0JzQUVJQVZnQlhBR1FBUXdCVkFHc0FSZ0JJQUdRQU1BQkdBR29BVVFCVkFFb0FSQUJSQUZVQVdnQktBRkVBVmdCS0FGSUFVUUJ1QUU0QVFnQlNBRlVBYkFCQ0FGWUFNUUJHQUVNQVZnQnJBRVlBUmdCWEFGVUFSZ0JTQUdRQU1BQktBRkFBVVFCVkFGb0FWZ0JSQUZZQVNnQnVBRkVBYXdCc0FFSUFVZ0JyQURFQVFnQldBR3dBUmdCREFGSUFNQUJHQUVZQVRnQkZBRVlBV0FCYUFEQUFSZ0F6QUZFQVZRQldBRm9BVVFCVkFEVUFRZ0JSQUd3QVNnQkNBRklBYkFCV0FFSUFWd0JyQUVZQVFnQmxBR3NBUmdCSEFGSUFWUUJHQUZjQVdnQXdBRW9BVUFCUkF" +
+ "GVUFXZ0JLQUZFQVZnQldBRklBVVFCdUFFb0FRZ0JTQUdzQWJBQkNBRlVBVndCa0FFTUFWUUF3QUVZQVJ3QldBRlVBUmdCWEFGb0FNQUJLQUVRQVVRQlZBRm9BYWdCUkFGY0FTZ0J1QUZFQWJRQjBBRUlBVWdCVkFERUFRZ0JXQUZnQVpBQkRBR01BYXdCR0FFWUFWd0JWQUVZQVV3QmFBREFBU2dCV0FGRUFWUUJhQUZZQVVRQldBRW9BYmdCUkFHd0FUZ0JDQUZJQWJBQldBRUlBVmdCc0FFWUFRd0JUQURBQVJnQkpBRllBVlFCR0FGWUFWUUJWQUVvQVZ3QlJBRlVBV2dCYUFGRUFWd0JPQUc0QVVRQnNBRW9BUWdCU0FHd0FiQUJDQUZVQWJRQmtBRUlBWlFCckFFWUFSd0JTQUZVQVJnQm9BR1FBTUFCS0FFd0FVUUJWQUZZQVNn" +
+ "QlJBRllBVmdCdUFGRUFXQUJzQUVJQVVnQlVBRklBUWdCVkFGY0FaQUJEQUZZQVJRQkdBRWNBVmdCVkFFWUFVd0JhQURBQVNnQkVBRkVBVlFCYUFIWUFVUUJWQURFQVFnQlJBR3NBWkFCQ0FGSUFWZ0JHQUVJQVZnQldBRVlBUXdCV0FHc0FSZ0JHQUZjQVZRQkdBRlFBV2dBd0FFb0FVd0JSQUZVQVdnQldBRkVBVmdCS0FHNEFVUUJ1QUZZQVFnQlNBR3NBVmdCQ0FGWUFiQUJHQUVNQVVnQnJBRVlBUlFCaEFEQUFSZ0JXQUZFQVZRQktBRlVBVVFCVkFGWUFSZ0JSQUZZQWNBQXpBRkVBYXdCd0FFSUFVZ0JWQURFQVFnQlZBRllBUmdCREFHSUFhd0JHQUVZQVlRQXdBRVlBVWdCa0FEQUFTZ0JEQUZFQVZRQmtBR29BVVFCV0FF" +
+ "NEFVZ0JSQUdzQVNnQkNBRklBUkFCQ0FFSUFWUUJHQUVZQVFnQmFBREFBUmdCRUFGRUFWUUJHQUVvQVVRQlZBRVlBYmdCUkFGVUFUZ0JDQUZFQVZRQnNBRUlBVVFCWEFHTUFad0JKQUVNQVFRQm5BRWtBUXdCQkFEMEFJQUFnQUNBQUlBQT0gICA="
+
+ private fun getRandomSubstring(input: String, length: Int): String {
+ val startIndex = (0 until input.length - length + 1).random()
+ return input.substring(startIndex, startIndex + length)
+ }
+
+ private val randomLength = Random.Default.nextInt(13, 21)
+
+ private val decodedString = Base64.decode(littleBitCursedEncodedValue, Base64.DEFAULT).toString(Charsets.UTF_8).trim()
+
+ private val randomStringValue = getRandomSubstring(decodedString, randomLength)
+
+ private val chromiumBrowserValue = "org.chromium.chrome"
+
+ private val randomValue = when {
+ Random.nextInt(1, 11) == 1 -> chromiumBrowserValue // 10% chance
+ else -> randomStringValue // 90% chance
+ }
override val chapterUrlSuffix = ""
}
diff --git a/multisrc/overrides/madara/archerscans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/archerscans/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..2a2eaed8c6
Binary files /dev/null and b/multisrc/overrides/madara/archerscans/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/archerscans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/archerscans/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..0466e8330b
Binary files /dev/null and b/multisrc/overrides/madara/archerscans/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/archerscans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/archerscans/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..8b066144fd
Binary files /dev/null and b/multisrc/overrides/madara/archerscans/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/archerscans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/archerscans/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..7a0a2d993d
Binary files /dev/null and b/multisrc/overrides/madara/archerscans/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/archerscans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/archerscans/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..fb30df9b01
Binary files /dev/null and b/multisrc/overrides/madara/archerscans/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/archerscans/res/web_hi_res_512.png b/multisrc/overrides/madara/archerscans/res/web_hi_res_512.png
new file mode 100644
index 0000000000..d97452a259
Binary files /dev/null and b/multisrc/overrides/madara/archerscans/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/archerscans/src/ArcheRScans.kt b/multisrc/overrides/madara/archerscans/src/ArcheRScans.kt
new file mode 100644
index 0000000000..aa0cca8edd
--- /dev/null
+++ b/multisrc/overrides/madara/archerscans/src/ArcheRScans.kt
@@ -0,0 +1,9 @@
+package eu.kanade.tachiyomi.extension.en.archerscans
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+
+class ArcheRScans : Madara("ArcheR Scans", "https://www.archerscans.com", "en") {
+ override val useNewChapterEndpoint = false
+
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
+}
diff --git a/multisrc/overrides/madara/astrumscans/src/AstrumScans.kt b/multisrc/overrides/madara/astrumscans/src/AstrumScans.kt
new file mode 100644
index 0000000000..5c994d76aa
--- /dev/null
+++ b/multisrc/overrides/madara/astrumscans/src/AstrumScans.kt
@@ -0,0 +1,24 @@
+package eu.kanade.tachiyomi.extension.pt.astrumscans
+
+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 AstrumScans : Madara(
+ "Astrum Scans",
+ "https://astrumscans.xyz",
+ "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
+
+ override val mangaSubString = "series"
+}
diff --git a/multisrc/overrides/madara/asurascansus/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/asurascansus/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..9866f55dbb
Binary files /dev/null and b/multisrc/overrides/madara/asurascansus/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/asurascansus/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/asurascansus/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..4ef6d79367
Binary files /dev/null and b/multisrc/overrides/madara/asurascansus/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/asurascansus/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/asurascansus/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..e0a3e88406
Binary files /dev/null and b/multisrc/overrides/madara/asurascansus/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/asurascansus/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/asurascansus/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..2da953a2f6
Binary files /dev/null and b/multisrc/overrides/madara/asurascansus/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/asurascansus/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/asurascansus/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..7516a2dba6
Binary files /dev/null and b/multisrc/overrides/madara/asurascansus/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/asurascansus/res/web_hi_res_512.png b/multisrc/overrides/madara/asurascansus/res/web_hi_res_512.png
new file mode 100644
index 0000000000..688ccf4f03
Binary files /dev/null and b/multisrc/overrides/madara/asurascansus/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/asurascansus/src/AsuraScansUs.kt b/multisrc/overrides/madara/asurascansus/src/AsuraScansUs.kt
new file mode 100644
index 0000000000..5e1b63b87f
--- /dev/null
+++ b/multisrc/overrides/madara/asurascansus/src/AsuraScansUs.kt
@@ -0,0 +1,9 @@
+package eu.kanade.tachiyomi.extension.en.asurascansus
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+
+class AsuraScansUs : Madara("Asura Scans.us (unoriginal)", "https://asurascans.us", "en") {
+ override val useNewChapterEndpoint = true
+
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
+}
diff --git a/multisrc/overrides/madara/atikrost/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/atikrost/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index 0aed4d1604..0000000000
Binary files a/multisrc/overrides/madara/atikrost/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/atikrost/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/atikrost/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index bea5b60769..0000000000
Binary files a/multisrc/overrides/madara/atikrost/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/atikrost/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/atikrost/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 00f26184b5..0000000000
Binary files a/multisrc/overrides/madara/atikrost/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/atikrost/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/atikrost/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 0c00c7f52d..0000000000
Binary files a/multisrc/overrides/madara/atikrost/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/atikrost/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/atikrost/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index a1d193c2b8..0000000000
Binary files a/multisrc/overrides/madara/atikrost/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/atikrost/res/web_hi_res_512.png b/multisrc/overrides/madara/atikrost/res/web_hi_res_512.png
deleted file mode 100644
index 61e4b69a33..0000000000
Binary files a/multisrc/overrides/madara/atikrost/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/madara/atikrost/src/Atikrost.kt b/multisrc/overrides/madara/atikrost/src/Atikrost.kt
deleted file mode 100644
index f20e4eebd2..0000000000
--- a/multisrc/overrides/madara/atikrost/src/Atikrost.kt
+++ /dev/null
@@ -1,7 +0,0 @@
-package eu.kanade.tachiyomi.extension.tr.atikrost
-
-import eu.kanade.tachiyomi.multisrc.madara.Madara
-import java.text.SimpleDateFormat
-import java.util.Locale
-
-class Atikrost : Madara("Atikrost", "https://atikrost.com", "tr", SimpleDateFormat("MMMM dd, yyyy", Locale("tr")))
diff --git a/multisrc/overrides/mangathemesia/babelwuxia/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/babelwuxia/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/mangathemesia/babelwuxia/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/madara/babelwuxia/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/mangathemesia/babelwuxia/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/babelwuxia/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/mangathemesia/babelwuxia/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/madara/babelwuxia/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/mangathemesia/babelwuxia/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/babelwuxia/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/mangathemesia/babelwuxia/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/madara/babelwuxia/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/mangathemesia/babelwuxia/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/babelwuxia/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/mangathemesia/babelwuxia/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/madara/babelwuxia/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/mangathemesia/babelwuxia/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/babelwuxia/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/mangathemesia/babelwuxia/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/madara/babelwuxia/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/mangathemesia/babelwuxia/res/web_hi_res_512.png b/multisrc/overrides/madara/babelwuxia/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/mangathemesia/babelwuxia/res/web_hi_res_512.png
rename to multisrc/overrides/madara/babelwuxia/res/web_hi_res_512.png
diff --git a/multisrc/overrides/madara/babelwuxia/src/BabelWuxia.kt b/multisrc/overrides/madara/babelwuxia/src/BabelWuxia.kt
new file mode 100644
index 0000000000..94c3859843
--- /dev/null
+++ b/multisrc/overrides/madara/babelwuxia/src/BabelWuxia.kt
@@ -0,0 +1,56 @@
+package eu.kanade.tachiyomi.extension.en.babelwuxia
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+import eu.kanade.tachiyomi.network.POST
+import okhttp3.FormBody
+import okhttp3.Request
+
+class BabelWuxia : Madara("Babel Wuxia", "https://read.babelwuxia.com", "en") {
+
+ // moved from MangaThemesia
+ override val versionId = 2
+
+ override val useNewChapterEndpoint = true
+
+ override fun popularMangaNextPageSelector() = "body:not(:has(.no-posts))"
+
+ 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")
+ }
+}
diff --git a/multisrc/overrides/madara/bananamanga/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/bananamanga/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..f84457b58f
Binary files /dev/null and b/multisrc/overrides/madara/bananamanga/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/bananamanga/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/bananamanga/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..c242b942b1
Binary files /dev/null and b/multisrc/overrides/madara/bananamanga/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/bananamanga/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/bananamanga/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..7dcd02bb8b
Binary files /dev/null and b/multisrc/overrides/madara/bananamanga/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/bananamanga/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/bananamanga/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..2e0a5c8daf
Binary files /dev/null and b/multisrc/overrides/madara/bananamanga/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/bananamanga/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/bananamanga/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..6800241dbb
Binary files /dev/null and b/multisrc/overrides/madara/bananamanga/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/bananamanga/res/web_hi_res_512.png b/multisrc/overrides/madara/bananamanga/res/web_hi_res_512.png
new file mode 100644
index 0000000000..e07dd40317
Binary files /dev/null and b/multisrc/overrides/madara/bananamanga/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/bananamanga/src/BananaManga.kt b/multisrc/overrides/madara/bananamanga/src/BananaManga.kt
new file mode 100644
index 0000000000..dcadac1e96
--- /dev/null
+++ b/multisrc/overrides/madara/bananamanga/src/BananaManga.kt
@@ -0,0 +1,9 @@
+package eu.kanade.tachiyomi.extension.en.bananamanga
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+
+class BananaManga : Madara("Banana Manga", "https://bananamanga.net", "en") {
+ override val useNewChapterEndpoint = true
+
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
+}
diff --git a/multisrc/overrides/madara/barmanga/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/barmanga/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..2d70520758
Binary files /dev/null and b/multisrc/overrides/madara/barmanga/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/barmanga/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/barmanga/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..b8329e9ca5
Binary files /dev/null and b/multisrc/overrides/madara/barmanga/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/barmanga/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/barmanga/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..902e1347de
Binary files /dev/null and b/multisrc/overrides/madara/barmanga/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/barmanga/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/barmanga/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..f68cd3571e
Binary files /dev/null and b/multisrc/overrides/madara/barmanga/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/barmanga/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/barmanga/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..dc81d0d27f
Binary files /dev/null and b/multisrc/overrides/madara/barmanga/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/barmanga/res/web_hi_res_512.png b/multisrc/overrides/madara/barmanga/res/web_hi_res_512.png
new file mode 100644
index 0000000000..ccc6ce08b3
Binary files /dev/null and b/multisrc/overrides/madara/barmanga/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/barmanga/src/BarManga.kt b/multisrc/overrides/madara/barmanga/src/BarManga.kt
new file mode 100644
index 0000000000..17c6d91e57
--- /dev/null
+++ b/multisrc/overrides/madara/barmanga/src/BarManga.kt
@@ -0,0 +1,52 @@
+package eu.kanade.tachiyomi.extension.es.barmanga
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+import eu.kanade.tachiyomi.network.POST
+import okhttp3.FormBody
+import okhttp3.Request
+import java.text.SimpleDateFormat
+import java.util.Locale
+
+class BarManga : Madara(
+ "BarManga",
+ "https://barmanga.com",
+ "es",
+ SimpleDateFormat("MM/dd/yyyy", Locale.ROOT),
+) {
+ override fun popularMangaNextPageSelector() = "body:not(:has(.no-posts))"
+ override val mangaDetailsSelectorDescription = "div.flamesummary > div.manga-excerpt"
+
+ private fun loadMoreRequest(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]", "full")
+ add("vars[post_type]", "wp-manga")
+ add("vars[post_status]", "publish")
+ add("vars[meta_key]", metaKey)
+ add("vars[order]", "desc")
+ add("vars[meta_query][relation]", "AND")
+ add("vars[manga_archives_item_layout]", "big_thumbnail")
+ }.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 loadMoreRequest(page - 1, "_wp_manga_views")
+ }
+
+ override fun latestUpdatesRequest(page: Int): Request {
+ return loadMoreRequest(page - 1, "_latest_update")
+ }
+}
diff --git a/multisrc/overrides/madara/bichentraducoes/src/BichenTraducoes.kt b/multisrc/overrides/madara/bichentraducoes/src/BichenTraducoes.kt
deleted file mode 100644
index e5aac81ffa..0000000000
--- a/multisrc/overrides/madara/bichentraducoes/src/BichenTraducoes.kt
+++ /dev/null
@@ -1,22 +0,0 @@
-package eu.kanade.tachiyomi.extension.pt.bichentraducoes
-
-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 BichenTraducoes : Madara(
- "Bichen Traduções",
- "https://bichentraducoes.com",
- "pt-BR",
- SimpleDateFormat("MMMMM dd, yyyy", Locale("pt", "BR")),
-) {
-
- override val client: OkHttpClient = super.client.newBuilder()
- .rateLimit(1, 3, TimeUnit.SECONDS)
- .build()
-
- override val useNewChapterEndpoint = true
-}
diff --git a/multisrc/overrides/madara/birdtoon/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/birdtoon/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..aff88e0252
Binary files /dev/null and b/multisrc/overrides/madara/birdtoon/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/birdtoon/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/birdtoon/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..9fd3c51556
Binary files /dev/null and b/multisrc/overrides/madara/birdtoon/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/birdtoon/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/birdtoon/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..1a21fd20b1
Binary files /dev/null and b/multisrc/overrides/madara/birdtoon/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/birdtoon/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/birdtoon/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..7b06cb268a
Binary files /dev/null and b/multisrc/overrides/madara/birdtoon/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/birdtoon/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/birdtoon/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..e11f6feccf
Binary files /dev/null and b/multisrc/overrides/madara/birdtoon/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/birdtoon/res/web_hi_res_512.png b/multisrc/overrides/madara/birdtoon/res/web_hi_res_512.png
new file mode 100644
index 0000000000..7f6a66fb2f
Binary files /dev/null and b/multisrc/overrides/madara/birdtoon/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/birdtoon/src/BirdToon.kt b/multisrc/overrides/madara/birdtoon/src/BirdToon.kt
new file mode 100644
index 0000000000..59cb32059c
--- /dev/null
+++ b/multisrc/overrides/madara/birdtoon/src/BirdToon.kt
@@ -0,0 +1,15 @@
+package eu.kanade.tachiyomi.extension.id.birdtoon
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+
+class BirdToon : Madara("BirdToon", "https://birdtoon.net", "id") {
+ override val mangaSubString = "komik"
+
+ override fun searchPage(page: Int): String {
+ return if (page > 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..5c99fcdce6
--- /dev/null
+++ b/multisrc/overrides/madara/cerisescans/src/CeriseScan.kt
@@ -0,0 +1,45 @@
+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.SChapter
+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",
+ "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)
+ }
+
+ override fun pageListRequest(chapter: SChapter): Request {
+ if (chapter.url.startsWith("http")) {
+ return GET(chapter.url.replace("/home1", ""), headers)
+ }
+
+ return GET(baseUrl + chapter.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/coffeemanga/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/coffeemanga/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/madara/coffeemanga/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/madara/coffeemanga/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/madara/coffeemanga/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/coffeemanga/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/madara/coffeemanga/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/madara/coffeemanga/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/madara/coffeemanga/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/coffeemanga/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/madara/coffeemanga/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/madara/coffeemanga/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/madara/coffeemanga/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/coffeemanga/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/madara/coffeemanga/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/madara/coffeemanga/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/madara/coffeemanga/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/coffeemanga/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/madara/coffeemanga/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/madara/coffeemanga/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/madara/coffeemanga/web_hi_res_512.png b/multisrc/overrides/madara/coffeemanga/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/madara/coffeemanga/web_hi_res_512.png
rename to multisrc/overrides/madara/coffeemanga/res/web_hi_res_512.png
diff --git a/multisrc/overrides/madara/coffeemanga/src/CoffeeManga.kt b/multisrc/overrides/madara/coffeemanga/src/CoffeeManga.kt
new file mode 100644
index 0000000000..dd652e1985
--- /dev/null
+++ b/multisrc/overrides/madara/coffeemanga/src/CoffeeManga.kt
@@ -0,0 +1,19 @@
+package eu.kanade.tachiyomi.extension.en.coffeemanga
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+import org.jsoup.nodes.Element
+
+class CoffeeManga : Madara("Coffee Manga", "https://coffeemanga.io", "en") {
+ override val useNewChapterEndpoint = false
+
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
+
+ override fun imageFromElement(element: Element): String? {
+ return when {
+ element.hasAttr("data-src") && element.attr("data-src").isNotEmpty() -> element.attr("abs:data-src")
+ element.hasAttr("data-lazy-src") && element.attr("data-lazy-src").isNotEmpty() -> element.attr("abs:data-lazy-src")
+ element.hasAttr("srcset") && element.attr("srcset").isNotEmpty() -> element.attr("abs:srcset").substringBefore(" ")
+ else -> element.attr("abs:src")
+ }
+ }
+}
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/comictoon/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/comictoon/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index cfe9de43b3..0000000000
Binary files a/multisrc/overrides/madara/comictoon/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/comictoon/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/comictoon/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index 00afe09056..0000000000
Binary files a/multisrc/overrides/madara/comictoon/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/comictoon/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/comictoon/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 42324c4175..0000000000
Binary files a/multisrc/overrides/madara/comictoon/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/comictoon/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/comictoon/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 182779dee4..0000000000
Binary files a/multisrc/overrides/madara/comictoon/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/comictoon/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/comictoon/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 5044b93039..0000000000
Binary files a/multisrc/overrides/madara/comictoon/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/comictoon/res/web_hi_res_512.png b/multisrc/overrides/madara/comictoon/res/web_hi_res_512.png
deleted file mode 100644
index f4914a0fd9..0000000000
Binary files a/multisrc/overrides/madara/comictoon/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/madara/comictoon/src/Comictoon.kt b/multisrc/overrides/madara/comictoon/src/Comictoon.kt
deleted file mode 100644
index 5f8c084345..0000000000
--- a/multisrc/overrides/madara/comictoon/src/Comictoon.kt
+++ /dev/null
@@ -1,7 +0,0 @@
-package eu.kanade.tachiyomi.extension.th.comictoon
-
-import eu.kanade.tachiyomi.multisrc.madara.Madara
-import java.text.SimpleDateFormat
-import java.util.Locale
-
-class Comictoon : Madara("Comictoon", "https://comictoonthaith-new.com", "th", SimpleDateFormat("MMMMM dd, yyyy", Locale("th")))
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/darkscans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/darkscans/res/mipmap-hdpi/ic_launcher.png
index afe14bd9ee..8dfb57b8f2 100644
Binary files a/multisrc/overrides/madara/darkscans/res/mipmap-hdpi/ic_launcher.png and b/multisrc/overrides/madara/darkscans/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/darkscans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/darkscans/res/mipmap-mdpi/ic_launcher.png
index 2ad66d1655..d4f3192f6a 100644
Binary files a/multisrc/overrides/madara/darkscans/res/mipmap-mdpi/ic_launcher.png and b/multisrc/overrides/madara/darkscans/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/darkscans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/darkscans/res/mipmap-xhdpi/ic_launcher.png
index a8f4d75581..b340f76218 100644
Binary files a/multisrc/overrides/madara/darkscans/res/mipmap-xhdpi/ic_launcher.png and b/multisrc/overrides/madara/darkscans/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/darkscans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/darkscans/res/mipmap-xxhdpi/ic_launcher.png
index a81d4c0a90..e3b07988c5 100644
Binary files a/multisrc/overrides/madara/darkscans/res/mipmap-xxhdpi/ic_launcher.png and b/multisrc/overrides/madara/darkscans/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/darkscans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/darkscans/res/mipmap-xxxhdpi/ic_launcher.png
index 6acd47a201..7411446760 100644
Binary files a/multisrc/overrides/madara/darkscans/res/mipmap-xxxhdpi/ic_launcher.png and b/multisrc/overrides/madara/darkscans/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/darkscans/res/web_hi_res_512.png b/multisrc/overrides/madara/darkscans/res/web_hi_res_512.png
index a3c93a8525..012928faa7 100644
Binary files a/multisrc/overrides/madara/darkscans/res/web_hi_res_512.png and b/multisrc/overrides/madara/darkscans/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/darkscans/src/DarkScans.kt b/multisrc/overrides/madara/darkscans/src/DarkScans.kt
new file mode 100644
index 0000000000..68470bd681
--- /dev/null
+++ b/multisrc/overrides/madara/darkscans/src/DarkScans.kt
@@ -0,0 +1,16 @@
+package eu.kanade.tachiyomi.extension.en.darkscans
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+import eu.kanade.tachiyomi.network.interceptor.rateLimit
+import okhttp3.OkHttpClient
+
+class DarkScans : Madara("Dark Scans", "https://darkscans.com", "en") {
+
+ override val client: OkHttpClient = super.client.newBuilder()
+ .rateLimit(20, 4)
+ .build()
+
+ override val mangaSubString = "all-series"
+
+ override val filterNonMangaItems = false
+}
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/egymanga/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/egymanga/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index 8b7de882e3..0000000000
Binary files a/multisrc/overrides/madara/egymanga/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/egymanga/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/egymanga/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index 9b68fdb47b..0000000000
Binary files a/multisrc/overrides/madara/egymanga/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/egymanga/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/egymanga/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 7668e11c07..0000000000
Binary files a/multisrc/overrides/madara/egymanga/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/egymanga/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/egymanga/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 9c3f8825d5..0000000000
Binary files a/multisrc/overrides/madara/egymanga/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/egymanga/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/egymanga/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index ccf94d0190..0000000000
Binary files a/multisrc/overrides/madara/egymanga/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/egymanga/res/web_hi_res_512.png b/multisrc/overrides/madara/egymanga/res/web_hi_res_512.png
deleted file mode 100644
index aacf8845ff..0000000000
Binary files a/multisrc/overrides/madara/egymanga/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/madara/egymanga/src/EGYManga.kt b/multisrc/overrides/madara/egymanga/src/EGYManga.kt
deleted file mode 100644
index 1a7f9cd675..0000000000
--- a/multisrc/overrides/madara/egymanga/src/EGYManga.kt
+++ /dev/null
@@ -1,23 +0,0 @@
-package eu.kanade.tachiyomi.extension.ar.egymanga
-
-import eu.kanade.tachiyomi.multisrc.madara.Madara
-import eu.kanade.tachiyomi.source.model.SChapter
-import okhttp3.Response
-import java.text.SimpleDateFormat
-import java.util.Locale
-
-class EGYManga : Madara(
- "EGY Manga",
- "https://egymanga.net",
- "ar",
- SimpleDateFormat("MMMM dd, yyyy", Locale("ar")),
-) {
-
- // The website does not flag the content.
- override val filterNonMangaItems = false
-
- override val pageListParseSelector = "div.separator"
-
- override fun chapterListParse(response: Response): List =
- super.chapterListParse(response).reversed()
-}
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/empirewebtoon/src/EmpireWebtoon.kt b/multisrc/overrides/madara/empirewebtoon/src/EmpireWebtoon.kt
index e2ce3921a4..01c672433e 100644
--- a/multisrc/overrides/madara/empirewebtoon/src/EmpireWebtoon.kt
+++ b/multisrc/overrides/madara/empirewebtoon/src/EmpireWebtoon.kt
@@ -11,9 +11,14 @@ import uy.kohesive.injekt.api.get
import java.text.SimpleDateFormat
import java.util.Locale
-class EmpireWebtoon : Madara("Empire Webtoon", "https://webtoonempire.com", "ar", SimpleDateFormat("yyyy MMMMM dd", Locale("ar"))) {
+class EmpireWebtoon : Madara(
+ "Empire Webtoon",
+ "https://webtoonsempireron.com",
+ "ar",
+ SimpleDateFormat("d MMMM، yyyy", Locale("ar")),
+) {
- private val defaultBaseUrl = "https://webtoonempire.com"
+ private val defaultBaseUrl = "https://webtoonsempireron.com"
override val baseUrl by lazy { getPrefBaseUrl() }
@@ -21,6 +26,12 @@ class EmpireWebtoon : Madara("Empire Webtoon", "https://webtoonempire.com", "ar"
Injekt.get().getSharedPreferences("source_$id", 0x0000)
}
+ override val mangaSubString = "webtoon"
+
+ override val useNewChapterEndpoint = false
+
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
+
companion object {
private const val RESTART_TACHIYOMI = "Restart Tachiyomi to apply new setting."
private const val BASE_URL_PREF_TITLE = "Override BaseUrl"
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/evascans/src/EvaScans.kt b/multisrc/overrides/madara/evascans/src/EvaScans.kt
index d76c36a855..6e53567391 100644
--- a/multisrc/overrides/madara/evascans/src/EvaScans.kt
+++ b/multisrc/overrides/madara/evascans/src/EvaScans.kt
@@ -1,14 +1,32 @@
package eu.kanade.tachiyomi.extension.tr.evascans
import eu.kanade.tachiyomi.multisrc.madara.Madara
+import eu.kanade.tachiyomi.source.model.Page
+import org.jsoup.nodes.Document
import java.text.SimpleDateFormat
import java.util.Locale
class EvaScans : Madara(
- "EvaScans",
- "https://evascans.com",
+ "ManWe",
+ "https://manwe.pro",
"tr",
dateFormat = SimpleDateFormat("MMM d, yyy", Locale("tr")),
) {
- override val useNewChapterEndpoint = false
+ override val id = 5223802501310383833
+
+ override val useNewChapterEndpoint = true
+
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
+
+ override fun pageListParse(document: Document): List {
+ val pageList = super.pageListParse(document)
+
+ if (
+ pageList.isEmpty() &&
+ document.select(".content-blocked, .login-required").isNotEmpty()
+ ) {
+ throw Exception("Okumak için WebView üzerinden giriş yapın")
+ }
+ return pageList
+ }
}
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/faestorm/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/faestorm/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index 4634a904e3..0000000000
Binary files a/multisrc/overrides/madara/faestorm/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/faestorm/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/faestorm/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index c922e1225a..0000000000
Binary files a/multisrc/overrides/madara/faestorm/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/faestorm/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/faestorm/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 893159adca..0000000000
Binary files a/multisrc/overrides/madara/faestorm/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/faestorm/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/faestorm/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 577f07a5f1..0000000000
Binary files a/multisrc/overrides/madara/faestorm/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/faestorm/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/faestorm/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 87cf1b7377..0000000000
Binary files a/multisrc/overrides/madara/faestorm/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/faestorm/res/web_hi_res_512.png b/multisrc/overrides/madara/faestorm/res/web_hi_res_512.png
deleted file mode 100644
index bba71bef15..0000000000
Binary files a/multisrc/overrides/madara/faestorm/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/madara/faestorm/src/FaeStorm.kt b/multisrc/overrides/madara/faestorm/src/FaeStorm.kt
deleted file mode 100644
index aa5fc045b6..0000000000
--- a/multisrc/overrides/madara/faestorm/src/FaeStorm.kt
+++ /dev/null
@@ -1,12 +0,0 @@
-package eu.kanade.tachiyomi.extension.tr.faestorm
-
-import eu.kanade.tachiyomi.multisrc.madara.Madara
-import java.text.SimpleDateFormat
-import java.util.Locale
-
-class FaeStorm : Madara(
- "FaeStorm",
- "https://faestormmanga.com",
- "tr",
- SimpleDateFormat("d MMM yyy", Locale("tr")),
-)
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/firescans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/firescans/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..7ead298449
Binary files /dev/null and b/multisrc/overrides/madara/firescans/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/firescans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/firescans/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..74e31a9187
Binary files /dev/null and b/multisrc/overrides/madara/firescans/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/firescans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/firescans/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..bf4e8f08ba
Binary files /dev/null and b/multisrc/overrides/madara/firescans/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/firescans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/firescans/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..e18e8d8b7c
Binary files /dev/null and b/multisrc/overrides/madara/firescans/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/firescans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/firescans/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..c677567c36
Binary files /dev/null and b/multisrc/overrides/madara/firescans/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/firescans/res/web_hi_res_512.png b/multisrc/overrides/madara/firescans/res/web_hi_res_512.png
new file mode 100644
index 0000000000..e06e29a8ac
Binary files /dev/null and b/multisrc/overrides/madara/firescans/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/firescans/src/FireScans.kt b/multisrc/overrides/madara/firescans/src/FireScans.kt
new file mode 100644
index 0000000000..a91394af4c
--- /dev/null
+++ b/multisrc/overrides/madara/firescans/src/FireScans.kt
@@ -0,0 +1,67 @@
+package eu.kanade.tachiyomi.extension.en.firescans
+
+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 kotlinx.serialization.json.jsonArray
+import kotlinx.serialization.json.jsonObject
+import kotlinx.serialization.json.jsonPrimitive
+import okhttp3.OkHttpClient
+import org.jsoup.nodes.Document
+
+class FireScans : Madara("Fire Scans", "https://firescans.xyz", "en") {
+
+ override val client: OkHttpClient = super.client.newBuilder()
+ .rateLimit(20, 5)
+ .build()
+
+ override val useNewChapterEndpoint: Boolean = true
+
+ override fun pageListParse(document: Document): List {
+ countViews(document)
+
+ val chapterProtector = document.selectFirst(chapterProtectorSelector)
+ ?: return document.select(pageListParseSelector).mapIndexed { index, element ->
+ val imageUrl = element.selectFirst("img")?.let { imageFromElement(it) }
+ Page(index, document.location(), imageUrl)
+ }
+
+ val chapterProtectorHtml = if (chapterProtector.attr("src").startsWith("data:text/javascript;base64,")) {
+ Base64.decode(chapterProtector.attr("src").substringAfter(","), Base64.DEFAULT).decodeToString()
+ } else {
+ chapterProtector.html()
+ }
+
+ val password = chapterProtectorHtml
+ .substringAfter("wpmangaprotectornonce='")
+ .substringBefore("';")
+ val chapterData = json.parseToJsonElement(
+ chapterProtectorHtml
+ .substringAfter("chapter_data='")
+ .substringBefore("';")
+ .replace("\\/", "/"),
+ ).jsonObject
+
+ val unsaltedCiphertext = Base64.decode(chapterData["ct"]!!.jsonPrimitive.content, Base64.DEFAULT)
+ val salt = chapterData["s"]!!.jsonPrimitive.content.decodeHex()
+ val ciphertext = SALTED + salt + unsaltedCiphertext
+
+ val rawImgArray = CryptoAES.decrypt(Base64.encodeToString(ciphertext, Base64.DEFAULT), password)
+ val imgArrayString = json.parseToJsonElement(rawImgArray).jsonPrimitive.content
+ val imgArray = json.parseToJsonElement(imgArrayString).jsonArray
+
+ return imgArray.mapIndexed { idx, it ->
+ Page(idx, document.location(), it.jsonPrimitive.content)
+ }
+ }
+
+ private fun String.decodeHex(): ByteArray {
+ check(length % 2 == 0) { "Must have an even length" }
+
+ return chunked(2)
+ .map { it.toInt(16).toByte() }
+ .toByteArray()
+ }
+}
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/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/fizmanga/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index 9676bf4b03..0000000000
Binary files a/multisrc/overrides/madara/fizmanga/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/fizmanga/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/fizmanga/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index 927a5513c3..0000000000
Binary files a/multisrc/overrides/madara/fizmanga/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/fizmanga/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/fizmanga/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 69cf5e5336..0000000000
Binary files a/multisrc/overrides/madara/fizmanga/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/fizmanga/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/fizmanga/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index f63ec4f05c..0000000000
Binary files a/multisrc/overrides/madara/fizmanga/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/fizmanga/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/fizmanga/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 2286af53ff..0000000000
Binary files a/multisrc/overrides/madara/fizmanga/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/fizmanga/res/web_hi_res_512.png b/multisrc/overrides/madara/fizmanga/res/web_hi_res_512.png
deleted file mode 100644
index dc50fd38c6..0000000000
Binary files a/multisrc/overrides/madara/fizmanga/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/madara/fizmanga/src/FizManga.kt b/multisrc/overrides/madara/fizmanga/src/FizManga.kt
deleted file mode 100644
index 91dd0cb750..0000000000
--- a/multisrc/overrides/madara/fizmanga/src/FizManga.kt
+++ /dev/null
@@ -1,9 +0,0 @@
-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)
-}
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/flowermanga/src/FlowerManga.kt b/multisrc/overrides/madara/flowermanga/src/FlowerManga.kt
new file mode 100644
index 0000000000..10c57b6056
--- /dev/null
+++ b/multisrc/overrides/madara/flowermanga/src/FlowerManga.kt
@@ -0,0 +1,20 @@
+package eu.kanade.tachiyomi.extension.pt.flowermanga
+
+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 FlowerManga : Madara(
+ "Flower Manga",
+ "https://flowermanga.com",
+ "pt-BR",
+ SimpleDateFormat("dd MMMMM yyyy", Locale("pt", "BR")),
+) {
+
+ override val client: OkHttpClient = super.client.newBuilder()
+ .rateLimit(1, 2, TimeUnit.SECONDS)
+ .build()
+}
diff --git a/multisrc/overrides/madara/frdashscan/src/FRScan.kt b/multisrc/overrides/madara/frdashscan/src/FRScan.kt
index eb270757ea..6b8f17c258 100644
--- a/multisrc/overrides/madara/frdashscan/src/FRScan.kt
+++ b/multisrc/overrides/madara/frdashscan/src/FRScan.kt
@@ -1,7 +1,17 @@
package eu.kanade.tachiyomi.extension.fr.frdashscan
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 FRScan : Madara("FR-Scan", "https://fr-scan.com", "fr", dateFormat = SimpleDateFormat("MMMM d, yyyy", Locale.FRANCE))
+class FRScan : Madara("FR-Scan", "https://fr-scan.com", "fr", dateFormat = SimpleDateFormat("MMMM d, yyyy", Locale.FRANCE)) {
+
+ override val client: OkHttpClient = super.client.newBuilder()
+ .rateLimit(1, 2, TimeUnit.SECONDS)
+ .build()
+
+ override val useNewChapterEndpoint = true
+}
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/fugmanga/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/fugmanga/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index 0fb37ffe4c..0000000000
Binary files a/multisrc/overrides/madara/fugmanga/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/fugmanga/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/fugmanga/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index 455f932e58..0000000000
Binary files a/multisrc/overrides/madara/fugmanga/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/fugmanga/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/fugmanga/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 4e8cf345af..0000000000
Binary files a/multisrc/overrides/madara/fugmanga/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/fugmanga/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/fugmanga/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 22c0e43181..0000000000
Binary files a/multisrc/overrides/madara/fugmanga/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/fugmanga/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/fugmanga/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 197ec7d7c0..0000000000
Binary files a/multisrc/overrides/madara/fugmanga/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/fugmanga/res/web_hi_res_512.png b/multisrc/overrides/madara/fugmanga/res/web_hi_res_512.png
deleted file mode 100644
index b14a9bcb00..0000000000
Binary files a/multisrc/overrides/madara/fugmanga/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/madara/fukushuunoyuusha/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/fukushuunoyuusha/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index da37b48da3..0000000000
Binary files a/multisrc/overrides/madara/fukushuunoyuusha/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/fukushuunoyuusha/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/fukushuunoyuusha/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index e48e74241e..0000000000
Binary files a/multisrc/overrides/madara/fukushuunoyuusha/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/fukushuunoyuusha/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/fukushuunoyuusha/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 78dfa61578..0000000000
Binary files a/multisrc/overrides/madara/fukushuunoyuusha/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/fukushuunoyuusha/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/fukushuunoyuusha/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 2dd6d3ddcf..0000000000
Binary files a/multisrc/overrides/madara/fukushuunoyuusha/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/fukushuunoyuusha/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/fukushuunoyuusha/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index b99a1a1de7..0000000000
Binary files a/multisrc/overrides/madara/fukushuunoyuusha/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/fukushuunoyuusha/res/web_hi_res_512.png b/multisrc/overrides/madara/fukushuunoyuusha/res/web_hi_res_512.png
deleted file mode 100644
index 72a7f16869..0000000000
Binary files a/multisrc/overrides/madara/fukushuunoyuusha/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/madara/fukushuunoyuusha/src/FukushuunoYuusha.kt b/multisrc/overrides/madara/fukushuunoyuusha/src/FukushuunoYuusha.kt
deleted file mode 100644
index 5d86ca129b..0000000000
--- a/multisrc/overrides/madara/fukushuunoyuusha/src/FukushuunoYuusha.kt
+++ /dev/null
@@ -1,12 +0,0 @@
-package eu.kanade.tachiyomi.extension.fr.fukushuunoyuusha
-
-import eu.kanade.tachiyomi.multisrc.madara.Madara
-import java.text.SimpleDateFormat
-import java.util.Locale
-
-class FukushuunoYuusha : Madara(
- "Fukushuu no Yuusha",
- "https://fny-scantrad.com",
- "fr",
- dateFormat = SimpleDateFormat("dd/MM/yy", Locale.US),
-)
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/geasstoon/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/geasstoon/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index 7d22c90c6c..0000000000
Binary files a/multisrc/overrides/madara/geasstoon/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/geasstoon/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/geasstoon/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index ff68ed91b8..0000000000
Binary files a/multisrc/overrides/madara/geasstoon/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/geasstoon/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/geasstoon/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index cd374f8777..0000000000
Binary files a/multisrc/overrides/madara/geasstoon/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/geasstoon/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/geasstoon/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 3c1827bb02..0000000000
Binary files a/multisrc/overrides/madara/geasstoon/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/geasstoon/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/geasstoon/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index a2f1d05a16..0000000000
Binary files a/multisrc/overrides/madara/geasstoon/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/geasstoon/res/web_hi_res_512.png b/multisrc/overrides/madara/geasstoon/res/web_hi_res_512.png
deleted file mode 100644
index c0affbebbd..0000000000
Binary files a/multisrc/overrides/madara/geasstoon/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/madara/geasstoon/src/GeassToon.kt b/multisrc/overrides/madara/geasstoon/src/GeassToon.kt
deleted file mode 100644
index 414eb2716f..0000000000
--- a/multisrc/overrides/madara/geasstoon/src/GeassToon.kt
+++ /dev/null
@@ -1,14 +0,0 @@
-package eu.kanade.tachiyomi.extension.tr.geasstoon
-
-import eu.kanade.tachiyomi.multisrc.madara.Madara
-import java.text.SimpleDateFormat
-import java.util.Locale
-
-class GeassToon : Madara(
- "GeassToon",
- "https://geasstoon.com",
- "tr",
- dateFormat = SimpleDateFormat("MMM d, yyy", Locale("tr")),
-) {
- 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/hatachimanga/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/hatachimanga/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index cd720cb144..0000000000
Binary files a/multisrc/overrides/madara/hatachimanga/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/hatachimanga/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/hatachimanga/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index 4b25d92802..0000000000
Binary files a/multisrc/overrides/madara/hatachimanga/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/hatachimanga/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/hatachimanga/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 7f3841ef91..0000000000
Binary files a/multisrc/overrides/madara/hatachimanga/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/hatachimanga/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/hatachimanga/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index a69788c980..0000000000
Binary files a/multisrc/overrides/madara/hatachimanga/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/hatachimanga/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/hatachimanga/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 29336f9061..0000000000
Binary files a/multisrc/overrides/madara/hatachimanga/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/hatachimanga/res/web_hi_res_512.png b/multisrc/overrides/madara/hatachimanga/res/web_hi_res_512.png
deleted file mode 100644
index f43bae8ddd..0000000000
Binary files a/multisrc/overrides/madara/hatachimanga/res/web_hi_res_512.png and /dev/null differ
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..ecfbff564b 100644
--- a/multisrc/overrides/madara/hiperdex/src/Hiperdex.kt
+++ b/multisrc/overrides/madara/hiperdex/src/Hiperdex.kt
@@ -3,41 +3,103 @@ package eu.kanade.tachiyomi.extension.en.hiperdex
import android.app.Application
import android.content.SharedPreferences
import android.widget.Toast
+import androidx.preference.EditTextPreference
import androidx.preference.PreferenceScreen
-import eu.kanade.tachiyomi.extension.BuildConfig
import eu.kanade.tachiyomi.multisrc.madara.Madara
+import okhttp3.HttpUrl.Companion.toHttpUrl
+import okhttp3.Interceptor
+import okhttp3.Response
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"
+ override fun searchPage(page: Int): String {
+ return if (page > 1) {
+ "page/$page/"
+ } else {
+ ""
+ }
+ }
override val baseUrl by lazy { getPrefBaseUrl() }
- private val preferences: SharedPreferences by lazy {
+ private val preferences by lazy {
Injekt.get().getSharedPreferences("source_$id", 0x0000)
}
+ override val client = super.client.newBuilder()
+ .addInterceptor(::domainChangeIntercept)
+ .build()
+
+ private var lastDomain = ""
+
+ private fun domainChangeIntercept(chain: Interceptor.Chain): Response {
+ val request = chain.request()
+
+ if (request.url.host !in listOf(preferences.baseUrlHost, lastDomain)) {
+ return chain.proceed(request)
+ }
+
+ if (lastDomain.isNotEmpty()) {
+ val newUrl = request.url.newBuilder()
+ .host(preferences.baseUrlHost)
+ .build()
+
+ return chain.proceed(
+ request.newBuilder()
+ .url(newUrl)
+ .build(),
+ )
+ }
+
+ val response = chain.proceed(request)
+
+ if (request.url.host == response.request.url.host) return response
+
+ response.close()
+
+ preferences.baseUrlHost = response.request.url.host
+
+ lastDomain = request.url.host
+
+ val newUrl = request.url.newBuilder()
+ .host(response.request.url.host)
+ .build()
+
+ return chain.proceed(
+ request.newBuilder()
+ .url(newUrl)
+ .build(),
+ )
+ }
+
companion object {
+ private const val defaultBaseUrlHost = "hiperdex.com"
private const val RESTART_TACHIYOMI = "Restart Tachiyomi to apply new setting."
private const val BASE_URL_PREF_TITLE = "Override BaseUrl"
- private const val BASE_URL_PREF = "overrideBaseUrl_v${BuildConfig.VERSION_CODE}"
- private const val BASE_URL_PREF_SUMMARY = "For temporary uses. Updating the extension will erase this setting."
+ private const val BASE_URL_PREF = "overrideBaseUrl_v2"
+ private const val BASE_URL_PREF_SUMMARY = "Enter a complete url starting with http"
}
override fun setupPreferenceScreen(screen: PreferenceScreen) {
- val baseUrlPref = androidx.preference.EditTextPreference(screen.context).apply {
+ val baseUrlPref = EditTextPreference(screen.context).apply {
key = BASE_URL_PREF
title = BASE_URL_PREF_TITLE
summary = BASE_URL_PREF_SUMMARY
- this.setDefaultValue(defaultBaseUrl)
+ this.setDefaultValue(defaultBaseUrlHost)
dialogTitle = BASE_URL_PREF_TITLE
- setOnPreferenceChangeListener { _, _ ->
- Toast.makeText(screen.context, RESTART_TACHIYOMI, Toast.LENGTH_LONG).show()
- true
+ setOnPreferenceChangeListener { _, newVal ->
+ val url = newVal as String
+ runCatching {
+ val host = url.toHttpUrl().host
+
+ Toast.makeText(screen.context, RESTART_TACHIYOMI, Toast.LENGTH_LONG).show()
+ preferences.edit().putString(BASE_URL_PREF, host).commit()
+ }
+ false
}
}
screen.addPreference(baseUrlPref)
@@ -45,5 +107,11 @@ class Hiperdex : Madara("Hiperdex", "https://1sthiperdex.com", "en") {
super.setupPreferenceScreen(screen)
}
- private fun getPrefBaseUrl(): String = preferences.getString(BASE_URL_PREF, defaultBaseUrl)!!
+ private var SharedPreferences.baseUrlHost
+ get() = getString(BASE_URL_PREF, defaultBaseUrlHost) ?: defaultBaseUrlHost
+ set(newHost) {
+ edit().putString(BASE_URL_PREF, newHost).commit()
+ }
+
+ private fun getPrefBaseUrl(): String = preferences.baseUrlHost.let { "https://$it" }
}
diff --git a/multisrc/overrides/madara/housemangas/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/housemangas/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..7abce771ea
Binary files /dev/null and b/multisrc/overrides/madara/housemangas/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/housemangas/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/housemangas/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..69ee23ba77
Binary files /dev/null and b/multisrc/overrides/madara/housemangas/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/housemangas/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/housemangas/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..18db3543ee
Binary files /dev/null and b/multisrc/overrides/madara/housemangas/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/housemangas/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/housemangas/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..d151cb8d78
Binary files /dev/null and b/multisrc/overrides/madara/housemangas/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/housemangas/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/housemangas/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..015a5039a3
Binary files /dev/null and b/multisrc/overrides/madara/housemangas/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/housemangas/res/web_hi_res_512.png b/multisrc/overrides/madara/housemangas/res/web_hi_res_512.png
new file mode 100644
index 0000000000..f91e7a2134
Binary files /dev/null and b/multisrc/overrides/madara/housemangas/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/housemangas/src/HouseMangas.kt b/multisrc/overrides/madara/housemangas/src/HouseMangas.kt
new file mode 100644
index 0000000000..078fae9450
--- /dev/null
+++ b/multisrc/overrides/madara/housemangas/src/HouseMangas.kt
@@ -0,0 +1,61 @@
+package eu.kanade.tachiyomi.extension.es.housemangas
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+import eu.kanade.tachiyomi.network.POST
+import eu.kanade.tachiyomi.network.interceptor.rateLimit
+import okhttp3.FormBody
+import okhttp3.Request
+import java.text.SimpleDateFormat
+import java.util.Locale
+import java.util.concurrent.TimeUnit
+
+class HouseMangas : Madara(
+ "HouseMangas",
+ "https://housemangas.com",
+ "es",
+ dateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale("es")),
+) {
+ override val client = super.client.newBuilder()
+ .rateLimit(2, 1, TimeUnit.SECONDS)
+ .build()
+
+ override val useNewChapterEndpoint = true
+
+ override fun popularMangaNextPageSelector() = "body:not(:has(.no-posts))"
+
+ override val mangaDetailsSelectorStatus = "div.post-content_item:contains(Estado) > div.summary-content"
+
+ private fun loadMoreRequest(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[order]", "desc")
+ 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 loadMoreRequest(page - 1, "_wp_manga_views")
+ }
+
+ override fun latestUpdatesRequest(page: Int): Request {
+ return loadMoreRequest(page - 1, "_latest_update")
+ }
+}
diff --git a/multisrc/overrides/madara/hscans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/hscans/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index 80193085aa..0000000000
Binary files a/multisrc/overrides/madara/hscans/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/hscans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/hscans/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index f5b8817843..0000000000
Binary files a/multisrc/overrides/madara/hscans/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/hscans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/hscans/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index c26f25dfa2..0000000000
Binary files a/multisrc/overrides/madara/hscans/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/hscans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/hscans/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index ab67ea70bf..0000000000
Binary files a/multisrc/overrides/madara/hscans/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/hscans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/hscans/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 3ba3585a53..0000000000
Binary files a/multisrc/overrides/madara/hscans/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/hscans/res/web_hi_res_512.png b/multisrc/overrides/madara/hscans/res/web_hi_res_512.png
deleted file mode 100644
index 11b2166dd8..0000000000
Binary files a/multisrc/overrides/madara/hscans/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/madara/hscans/src/Hscans.kt b/multisrc/overrides/madara/hscans/src/Hscans.kt
deleted file mode 100644
index 80952ebb3b..0000000000
--- a/multisrc/overrides/madara/hscans/src/Hscans.kt
+++ /dev/null
@@ -1,7 +0,0 @@
-package eu.kanade.tachiyomi.extension.en.hscans
-
-import eu.kanade.tachiyomi.multisrc.madara.Madara
-import java.text.SimpleDateFormat
-import java.util.Locale
-
-class Hscans : Madara("Hscans", "https://hscans.com", "en", SimpleDateFormat("dd/MM/yyyy", Locale.US))
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/inarimanga/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/inarimanga/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index 6a6ee9a744..0000000000
Binary files a/multisrc/overrides/madara/inarimanga/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/inarimanga/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/inarimanga/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index 75b96d94ec..0000000000
Binary files a/multisrc/overrides/madara/inarimanga/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/inarimanga/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/inarimanga/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index f8e465e967..0000000000
Binary files a/multisrc/overrides/madara/inarimanga/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/inarimanga/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/inarimanga/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 6cb7cbd3d2..0000000000
Binary files a/multisrc/overrides/madara/inarimanga/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/inarimanga/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/inarimanga/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index e73b3c73f7..0000000000
Binary files a/multisrc/overrides/madara/inarimanga/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/inarimanga/res/web_hi_res_512.png b/multisrc/overrides/madara/inarimanga/res/web_hi_res_512.png
deleted file mode 100644
index 69212c912b..0000000000
Binary files a/multisrc/overrides/madara/inarimanga/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/madara/inarimanga/src/InariManga.kt b/multisrc/overrides/madara/inarimanga/src/InariManga.kt
deleted file mode 100644
index 3e88f17886..0000000000
--- a/multisrc/overrides/madara/inarimanga/src/InariManga.kt
+++ /dev/null
@@ -1,46 +0,0 @@
-package eu.kanade.tachiyomi.extension.es.inarimanga
-
-import eu.kanade.tachiyomi.multisrc.madara.Madara
-import eu.kanade.tachiyomi.source.model.SManga
-import org.jsoup.nodes.Element
-import java.text.SimpleDateFormat
-import java.util.Locale
-
-class InariManga : Madara(
- "InariManga",
- "https://inarimanga.com",
- "es",
- dateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale("es")),
-) {
- override fun popularMangaSelector() = "div.page-listing-item div.post"
- override val popularMangaUrlSelector = "div.p-2 > h6 > a"
-
- override fun searchMangaSelector() = "div.page-listing-item div.post"
- private val searchMangaUrlSelector = "div.p-2 > h6 > a"
-
- override val mangaDetailsSelectorDescription = "div.card-body:has(h5:contains(Sinopsis))"
- override val mangaDetailsSelectorThumbnail = "div.col-sticky-top > img"
- override val mangaDetailsSelectorStatus = "div.card-body tr:has(th:contains(Estatus)) > td"
- override val mangaDetailsSelectorGenre = "div.my-auto > div.inline-block > a"
-
- override val useNewChapterEndpoint = true
-
- override fun chapterListSelector() = "tr.wp-manga-chapter"
- override fun chapterDateSelector() = "time.chapter-release-date"
-
- override fun searchMangaFromElement(element: Element): SManga {
- val manga = SManga.create()
-
- with(element) {
- select(searchMangaUrlSelector).first()?.let {
- manga.setUrlWithoutDomain(it.attr("abs:href"))
- manga.title = it.ownText()
- }
- select("img").first()?.let {
- manga.thumbnail_url = imageFromElement(it)
- }
- }
-
- return manga
- }
-}
diff --git a/multisrc/overrides/madara/inazumanga/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/inazumanga/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index e27238bfaa..0000000000
Binary files a/multisrc/overrides/madara/inazumanga/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/inazumanga/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/inazumanga/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index 44371cd303..0000000000
Binary files a/multisrc/overrides/madara/inazumanga/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/inazumanga/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/inazumanga/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 16fa1f7673..0000000000
Binary files a/multisrc/overrides/madara/inazumanga/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/inazumanga/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/inazumanga/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index fa673b592f..0000000000
Binary files a/multisrc/overrides/madara/inazumanga/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/inazumanga/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/inazumanga/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 95c0c9c25e..0000000000
Binary files a/multisrc/overrides/madara/inazumanga/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/inazumanga/res/web_hi_res_512.png b/multisrc/overrides/madara/inazumanga/res/web_hi_res_512.png
deleted file mode 100644
index 2e1b6a1839..0000000000
Binary files a/multisrc/overrides/madara/inazumanga/res/web_hi_res_512.png and /dev/null differ
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/izakaya/src/Izakaya.kt b/multisrc/overrides/madara/izakaya/src/Izakaya.kt
deleted file mode 100644
index 752e1050b5..0000000000
--- a/multisrc/overrides/madara/izakaya/src/Izakaya.kt
+++ /dev/null
@@ -1,34 +0,0 @@
-package eu.kanade.tachiyomi.extension.pt.izakaya
-
-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.OkHttpClient
-import okhttp3.Request
-import java.text.SimpleDateFormat
-import java.util.Locale
-import java.util.concurrent.TimeUnit
-
-class Izakaya : Madara(
- "Izakaya",
- "https://leitorizakaya.net",
- "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
-
- override fun imageRequest(page: Page): Request {
- val newHeaders = headersBuilder()
- .set("Referer", page.url)
- .set("Accept", "image/avif,image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8")
- .build()
-
- return GET(page.imageUrl!!, newHeaders)
- }
-}
diff --git a/multisrc/overrides/madara/jiangzaitoon/src/Jiangzaitoon.kt b/multisrc/overrides/madara/jiangzaitoon/src/Jiangzaitoon.kt
index ec6ea33079..6a36821969 100644
--- a/multisrc/overrides/madara/jiangzaitoon/src/Jiangzaitoon.kt
+++ b/multisrc/overrides/madara/jiangzaitoon/src/Jiangzaitoon.kt
@@ -1,7 +1,25 @@
package eu.kanade.tachiyomi.extension.tr.jiangzaitoon
import eu.kanade.tachiyomi.multisrc.madara.Madara
+import okhttp3.OkHttpClient
import java.text.SimpleDateFormat
import java.util.Locale
+import java.util.concurrent.TimeUnit
-class Jiangzaitoon : Madara("Jiangzaitoon", "https://jiangzaitoon.co", "tr", SimpleDateFormat("d MMM yyy", Locale("tr")))
+class Jiangzaitoon : Madara(
+ "Jiangzaitoon",
+ "https://jiangzaitoon.cc",
+ "tr",
+ SimpleDateFormat("d MMM yyy", Locale("tr")),
+) {
+ override val useNewChapterEndpoint = false
+
+ override val client: OkHttpClient by lazy {
+ super.client.newBuilder()
+ .connectTimeout(10, TimeUnit.SECONDS)
+ .readTimeout(3, TimeUnit.MINUTES) // aka shit source
+ .build()
+ }
+
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
+}
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/kakuseiproject/src/KakuseiProject.kt b/multisrc/overrides/madara/kakuseiproject/src/KakuseiProject.kt
new file mode 100644
index 0000000000..25409b4a67
--- /dev/null
+++ b/multisrc/overrides/madara/kakuseiproject/src/KakuseiProject.kt
@@ -0,0 +1,22 @@
+package eu.kanade.tachiyomi.extension.pt.kakuseiproject
+
+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 KakuseiProject : Madara(
+ "Kakusei Project",
+ "https://kakuseiproject.com.br",
+ "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/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/kiara/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/kiara/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index 6f5fdc059e..0000000000
Binary files a/multisrc/overrides/madara/kiara/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/kiara/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/kiara/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index 1b5135d2bd..0000000000
Binary files a/multisrc/overrides/madara/kiara/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/kiara/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/kiara/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index bd4eb6888c..0000000000
Binary files a/multisrc/overrides/madara/kiara/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/kiara/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/kiara/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index ab0518c481..0000000000
Binary files a/multisrc/overrides/madara/kiara/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/kiara/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/kiara/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index ddc9ce6a32..0000000000
Binary files a/multisrc/overrides/madara/kiara/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/kiara/res/web_hi_res_512.png b/multisrc/overrides/madara/kiara/res/web_hi_res_512.png
deleted file mode 100644
index 8d8d9f2c12..0000000000
Binary files a/multisrc/overrides/madara/kiara/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/madara/kiara/src/Kiara.kt b/multisrc/overrides/madara/kiara/src/Kiara.kt
deleted file mode 100644
index 95e257d416..0000000000
--- a/multisrc/overrides/madara/kiara/src/Kiara.kt
+++ /dev/null
@@ -1,11 +0,0 @@
-package eu.kanade.tachiyomi.extension.en.kiara
-
-import eu.kanade.tachiyomi.multisrc.madara.Madara
-import eu.kanade.tachiyomi.source.model.Page
-import org.jsoup.nodes.Document
-
-class Kiara : Madara("Kiara", "https://kiara.cool", "en") {
- override fun pageListParse(document: Document): List {
- return super.pageListParse(document).filterIndexed { index, _ -> index % 2 == 0 }
- }
-}
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/ladyestelarscan/src/LadyEstelarScan.kt b/multisrc/overrides/madara/ladyestelarscan/src/LadyEstelarScan.kt
new file mode 100644
index 0000000000..af4b8153d4
--- /dev/null
+++ b/multisrc/overrides/madara/ladyestelarscan/src/LadyEstelarScan.kt
@@ -0,0 +1,63 @@
+package eu.kanade.tachiyomi.extension.pt.ladyestelarscan
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+import eu.kanade.tachiyomi.network.asObservable
+import eu.kanade.tachiyomi.network.interceptor.rateLimit
+import eu.kanade.tachiyomi.source.model.FilterList
+import eu.kanade.tachiyomi.source.model.MangasPage
+import okhttp3.Call
+import okhttp3.OkHttpClient
+import okhttp3.Response
+import rx.Observable
+import java.lang.IllegalStateException
+import java.text.SimpleDateFormat
+import java.util.Locale
+import java.util.concurrent.TimeUnit
+
+class LadyEstelarScan : Madara(
+ "Lady Estelar Scan",
+ "https://ladyestelarscan.com.br",
+ "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
+
+ override fun fetchPopularManga(page: Int): Observable {
+ return client.newCall(popularMangaRequest(page))
+ .asObservableSuccessIgnoreCode(404)
+ .map(::popularMangaParse)
+ }
+
+ override fun fetchLatestUpdates(page: Int): Observable {
+ return client.newCall(latestUpdatesRequest(page))
+ .asObservableSuccessIgnoreCode(404)
+ .map(::latestUpdatesParse)
+ }
+
+ override fun fetchSearchManga(
+ page: Int,
+ query: String,
+ filters: FilterList,
+ ): Observable {
+ return client.newCall(searchMangaRequest(page, query, filters))
+ .asObservableSuccessIgnoreCode(404)
+ .map(::searchMangaParse)
+ }
+
+ /**
+ * Their site have some issues and is returning 404 in some pages even if they exist.
+ */
+ private fun Call.asObservableSuccessIgnoreCode(code: Int): Observable {
+ return asObservable().doOnNext { response ->
+ if (!response.isSuccessful && response.code != code) {
+ response.close()
+ throw IllegalStateException("HTTP error ${response.code}")
+ }
+ }
+ }
+}
diff --git a/multisrc/overrides/madara/legionscan/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/legionscan/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index 8f6903b252..0000000000
Binary files a/multisrc/overrides/madara/legionscan/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/legionscan/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/legionscan/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index bb25ada879..0000000000
Binary files a/multisrc/overrides/madara/legionscan/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/legionscan/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/legionscan/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 40ab1c2e17..0000000000
Binary files a/multisrc/overrides/madara/legionscan/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/legionscan/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/legionscan/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 9568ebd609..0000000000
Binary files a/multisrc/overrides/madara/legionscan/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/legionscan/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/legionscan/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index e15f210a3f..0000000000
Binary files a/multisrc/overrides/madara/legionscan/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/legionscan/res/web_hi_res_512.png b/multisrc/overrides/madara/legionscan/res/web_hi_res_512.png
deleted file mode 100644
index 9518e886fc..0000000000
Binary files a/multisrc/overrides/madara/legionscan/res/web_hi_res_512.png and /dev/null differ
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 = listOf(
- LeviatanScansEN(),
- LeviatanScansES(),
- )
-}
-
-class LeviatanScansEN : LeviatanScans(
- "https://en.leviatanscans.com",
- "en",
- SimpleDateFormat("MMM dd, yyyy", Locale.US),
-) {
- override val client: OkHttpClient = super.client.newBuilder()
- .rateLimit(1, 2)
- .build()
-
- override val mangaDetailsSelectorDescription = "div.manga-summary"
- override val mangaDetailsSelectorAuthor = "div.manga-authors"
-}
-
-class LeviatanScansES : LeviatanScans(
- "https://es.leviatanscans.com",
- "es",
- SimpleDateFormat("MMM dd, yy", Locale("es")),
-) {
- override val mangaDetailsSelectorStatus = ".post-content_item:contains(Status) .summary-content"
-}
diff --git a/multisrc/overrides/madara/limascans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/limascans/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index 9689b437a8..0000000000
Binary files a/multisrc/overrides/madara/limascans/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/limascans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/limascans/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index c386746eeb..0000000000
Binary files a/multisrc/overrides/madara/limascans/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/limascans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/limascans/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index d7038fb484..0000000000
Binary files a/multisrc/overrides/madara/limascans/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/limascans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/limascans/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 0feba0bae0..0000000000
Binary files a/multisrc/overrides/madara/limascans/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/limascans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/limascans/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 912927f9c9..0000000000
Binary files a/multisrc/overrides/madara/limascans/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/limascans/res/web_hi_res_512.png b/multisrc/overrides/madara/limascans/res/web_hi_res_512.png
deleted file mode 100644
index ced8ba5dea..0000000000
Binary files a/multisrc/overrides/madara/limascans/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/madara/limascans/src/LimaScans.kt b/multisrc/overrides/madara/limascans/src/LimaScans.kt
deleted file mode 100644
index a811c9afac..0000000000
--- a/multisrc/overrides/madara/limascans/src/LimaScans.kt
+++ /dev/null
@@ -1,31 +0,0 @@
-package eu.kanade.tachiyomi.extension.pt.limascans
-
-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 LimaScans : Madara(
- "Lima Scans",
- "http://limascans.xyz/v2",
- "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 fun mangaDetailsRequest(manga: SManga): Request {
- return GET(baseUrl + manga.url.removePrefix("/v2"), headers)
- }
-
- override fun chapterListRequest(manga: SManga): Request {
- return GET(baseUrl + manga.url.removePrefix("/v2"), headers)
- }
-}
diff --git a/multisrc/overrides/madara/limboscan/src/LimboScan.kt b/multisrc/overrides/madara/limboscan/src/LimboScan.kt
new file mode 100644
index 0000000000..1d9181b562
--- /dev/null
+++ b/multisrc/overrides/madara/limboscan/src/LimboScan.kt
@@ -0,0 +1,24 @@
+package eu.kanade.tachiyomi.extension.pt.limboscan
+
+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 LimboScan : Madara(
+ "Limbo Scan",
+ "https://limboscan.com.br",
+ "pt-BR",
+ SimpleDateFormat("dd/MM/yyyy", Locale("pt", "BR")),
+) {
+
+ override val client: OkHttpClient = super.client.newBuilder()
+ .rateLimit(1, 2, TimeUnit.SECONDS)
+ .build()
+
+ override val mangaSubString = "obras"
+
+ override val useNewChapterEndpoint = true
+}
diff --git a/multisrc/overrides/madara/linkstartscan/src/LinkStartScan.kt b/multisrc/overrides/madara/linkstartscan/src/LinkStartScan.kt
new file mode 100644
index 0000000000..c0df72aaeb
--- /dev/null
+++ b/multisrc/overrides/madara/linkstartscan/src/LinkStartScan.kt
@@ -0,0 +1,19 @@
+package eu.kanade.tachiyomi.extension.pt.linkstartscan
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+import okhttp3.OkHttpClient
+import java.text.SimpleDateFormat
+import java.util.Locale
+
+class LinkStartScan : Madara(
+ "Link Start Scan",
+ "https://www.linkstartscan.xyz",
+ "pt-BR",
+ SimpleDateFormat("dd/MM/yyyy", Locale("pt", "BR")),
+) {
+
+ override val client: OkHttpClient = super.client.newBuilder()
+ .build()
+
+ override val useNewChapterEndpoint = true
+}
diff --git a/multisrc/overrides/madara/lkscanlation/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/lkscanlation/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..4084c218be
Binary files /dev/null and b/multisrc/overrides/madara/lkscanlation/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/lkscanlation/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/lkscanlation/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..5897927bf1
Binary files /dev/null and b/multisrc/overrides/madara/lkscanlation/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/lkscanlation/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/lkscanlation/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..a34adfd897
Binary files /dev/null and b/multisrc/overrides/madara/lkscanlation/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/lkscanlation/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/lkscanlation/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..799a13cbc2
Binary files /dev/null and b/multisrc/overrides/madara/lkscanlation/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/lkscanlation/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/lkscanlation/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..f2809cecdc
Binary files /dev/null and b/multisrc/overrides/madara/lkscanlation/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/lkscanlation/res/web_hi_res_512.png b/multisrc/overrides/madara/lkscanlation/res/web_hi_res_512.png
new file mode 100644
index 0000000000..6883f143b0
Binary files /dev/null and b/multisrc/overrides/madara/lkscanlation/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/lkscanlation/src/LKScanlation.kt b/multisrc/overrides/madara/lkscanlation/src/LKScanlation.kt
new file mode 100644
index 0000000000..ff70698ddb
--- /dev/null
+++ b/multisrc/overrides/madara/lkscanlation/src/LKScanlation.kt
@@ -0,0 +1,26 @@
+package eu.kanade.tachiyomi.extension.es.lkscanlation
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+import eu.kanade.tachiyomi.network.interceptor.rateLimit
+import java.text.SimpleDateFormat
+import java.util.Locale
+
+class LKScanlation : Madara(
+ "Last Knight Translation",
+ "https://lkscanlation.com",
+ "es",
+ SimpleDateFormat("MMMM dd, yyyy", Locale("es")),
+) {
+ override val client = super.client.newBuilder()
+ .rateLimit(2, 1)
+ .build()
+
+ override val useNewChapterEndpoint = true
+
+ override val mangaSubString = "manhwa"
+
+ override val popularMangaUrlSelector = "div.post-title a:not([target='_self'])"
+
+ override val mangaDetailsSelectorAuthor = "div.manga-authors > a"
+ override val mangaDetailsSelectorDescription = "div.manga-summary"
+}
diff --git a/multisrc/overrides/madara/luffymanga/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/luffymanga/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..fd2b83cad9
Binary files /dev/null and b/multisrc/overrides/madara/luffymanga/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/luffymanga/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/luffymanga/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..b70207b1d1
Binary files /dev/null and b/multisrc/overrides/madara/luffymanga/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/luffymanga/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/luffymanga/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..dfd26d5488
Binary files /dev/null and b/multisrc/overrides/madara/luffymanga/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/luffymanga/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/luffymanga/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..4cb00558fb
Binary files /dev/null and b/multisrc/overrides/madara/luffymanga/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/luffymanga/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/luffymanga/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..fe2edcf4fe
Binary files /dev/null and b/multisrc/overrides/madara/luffymanga/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/luffymanga/res/web_hi_res_512.png b/multisrc/overrides/madara/luffymanga/res/web_hi_res_512.png
new file mode 100644
index 0000000000..61ff34eee9
Binary files /dev/null and b/multisrc/overrides/madara/luffymanga/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/luffymanga/src/LuffyManga.kt b/multisrc/overrides/madara/luffymanga/src/LuffyManga.kt
new file mode 100644
index 0000000000..36a37b3afa
--- /dev/null
+++ b/multisrc/overrides/madara/luffymanga/src/LuffyManga.kt
@@ -0,0 +1,9 @@
+package eu.kanade.tachiyomi.extension.en.luffymanga
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+
+class LuffyManga : Madara("Luffy Manga", "https://luffymanga.com", "en") {
+ override val useNewChapterEndpoint = false
+
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
+}
diff --git a/multisrc/overrides/madara/maidscan/src/MaidScan.kt b/multisrc/overrides/madara/maidscan/src/MaidScan.kt
new file mode 100644
index 0000000000..2ea8073d09
--- /dev/null
+++ b/multisrc/overrides/madara/maidscan/src/MaidScan.kt
@@ -0,0 +1,22 @@
+package eu.kanade.tachiyomi.extension.pt.maidscan
+
+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 MaidScan : Madara(
+ "Maid Scan",
+ "https://maidscan.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/manga18fx/src/Manga18fx.kt b/multisrc/overrides/madara/manga18fx/src/Manga18fx.kt
index 43592535da..87c54b9ea2 100644
--- a/multisrc/overrides/madara/manga18fx/src/Manga18fx.kt
+++ b/multisrc/overrides/madara/manga18fx/src/Manga18fx.kt
@@ -26,8 +26,6 @@ class Manga18fx : Madara(
) {
override val id = 3157287889751723714
- override val client = network.client
-
override val fetchGenres = false
override val sendViewCount = false
diff --git a/multisrc/overrides/madara/manga18h/src/Manga18h.kt b/multisrc/overrides/madara/manga18h/src/Manga18h.kt
new file mode 100644
index 0000000000..ef951efe49
--- /dev/null
+++ b/multisrc/overrides/madara/manga18h/src/Manga18h.kt
@@ -0,0 +1,9 @@
+package eu.kanade.tachiyomi.extension.en.manga18h
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+
+class Manga18h : Madara("Manga 18h", "https://manga18h.com", "en") {
+ override val useNewChapterEndpoint = false
+
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
+}
diff --git a/multisrc/overrides/madara/manga18x/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/manga18x/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..bb728ca0f0
Binary files /dev/null and b/multisrc/overrides/madara/manga18x/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/manga18x/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/manga18x/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..2e44b77c85
Binary files /dev/null and b/multisrc/overrides/madara/manga18x/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/manga18x/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/manga18x/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..4ed5e495ce
Binary files /dev/null and b/multisrc/overrides/madara/manga18x/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/manga18x/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/manga18x/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..96a508391f
Binary files /dev/null and b/multisrc/overrides/madara/manga18x/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/manga18x/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/manga18x/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..49621c939d
Binary files /dev/null and b/multisrc/overrides/madara/manga18x/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/manga18x/res/web_hi_res_512.png b/multisrc/overrides/madara/manga18x/res/web_hi_res_512.png
new file mode 100644
index 0000000000..99c220a077
Binary files /dev/null and b/multisrc/overrides/madara/manga18x/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/manga18x/src/Manga18x.kt b/multisrc/overrides/madara/manga18x/src/Manga18x.kt
new file mode 100644
index 0000000000..509fc67251
--- /dev/null
+++ b/multisrc/overrides/madara/manga18x/src/Manga18x.kt
@@ -0,0 +1,9 @@
+package eu.kanade.tachiyomi.extension.en.manga18x
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+
+class Manga18x : Madara("Manga 18x", "https://manga18x.net", "en") {
+ override val useNewChapterEndpoint = true
+
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
+}
diff --git a/multisrc/overrides/madara/manga1st/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/manga1st/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index f36a5c2a0d..0000000000
Binary files a/multisrc/overrides/madara/manga1st/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/manga1st/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/manga1st/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index 819f5b2cb0..0000000000
Binary files a/multisrc/overrides/madara/manga1st/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/manga1st/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/manga1st/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 6ce1565f9b..0000000000
Binary files a/multisrc/overrides/madara/manga1st/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/manga1st/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/manga1st/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index fb6d7684fb..0000000000
Binary files a/multisrc/overrides/madara/manga1st/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/manga1st/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/manga1st/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index ce3c26098a..0000000000
Binary files a/multisrc/overrides/madara/manga1st/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/manga1st/res/web_hi_res_512.png b/multisrc/overrides/madara/manga1st/res/web_hi_res_512.png
deleted file mode 100644
index 9c82d8117d..0000000000
Binary files a/multisrc/overrides/madara/manga1st/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/madara/manga4all/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/manga4all/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index d7044f3248..0000000000
Binary files a/multisrc/overrides/madara/manga4all/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/manga4all/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/manga4all/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index 0bf5afcff2..0000000000
Binary files a/multisrc/overrides/madara/manga4all/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/manga4all/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/manga4all/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 472e52f9bf..0000000000
Binary files a/multisrc/overrides/madara/manga4all/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/manga4all/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/manga4all/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 5711a845bf..0000000000
Binary files a/multisrc/overrides/madara/manga4all/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/manga4all/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/manga4all/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 42fb8dd08f..0000000000
Binary files a/multisrc/overrides/madara/manga4all/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/manga4all/res/web_hi_res_512.png b/multisrc/overrides/madara/manga4all/res/web_hi_res_512.png
deleted file mode 100644
index 808045b49d..0000000000
Binary files a/multisrc/overrides/madara/manga4all/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/madara/manga4all/src/Manga4All.kt b/multisrc/overrides/madara/manga4all/src/Manga4All.kt
deleted file mode 100644
index 84a04622ad..0000000000
--- a/multisrc/overrides/madara/manga4all/src/Manga4All.kt
+++ /dev/null
@@ -1,12 +0,0 @@
-package eu.kanade.tachiyomi.extension.en.manga4all
-
-import eu.kanade.tachiyomi.multisrc.madara.Madara
-import java.text.SimpleDateFormat
-import java.util.Locale
-
-class Manga4All : Madara(
- "Manga4All",
- "https://manga4all.net",
- "en",
- dateFormat = SimpleDateFormat("d MMM yyyy", Locale.US),
-)
diff --git a/multisrc/overrides/madara/mangaarabteam/src/MangaArabTeam.kt b/multisrc/overrides/madara/mangaarabteam/src/MangaArabTeam.kt
deleted file mode 100644
index ac2620f9c3..0000000000
--- a/multisrc/overrides/madara/mangaarabteam/src/MangaArabTeam.kt
+++ /dev/null
@@ -1,14 +0,0 @@
-package eu.kanade.tachiyomi.extension.ar.mangaarabteam
-
-import eu.kanade.tachiyomi.multisrc.madara.Madara
-import eu.kanade.tachiyomi.network.GET
-import eu.kanade.tachiyomi.source.model.Page
-import okhttp3.Request
-import java.text.SimpleDateFormat
-import java.util.Locale
-
-class MangaArabTeam : Madara("مانجا عرب تيم Manga Arab Team", "https://mangaarbteam.com", "ar", SimpleDateFormat("dd MMM، yyyy", Locale.forLanguageTag("ar"))) {
- override fun imageRequest(page: Page): Request {
- return GET(page.imageUrl!!.replace("http:", "https:"))
- }
-}
diff --git a/multisrc/overrides/madara/mangabee/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/mangabee/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..93c827bc0f
Binary files /dev/null and b/multisrc/overrides/madara/mangabee/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangabee/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/mangabee/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..a14794ca78
Binary files /dev/null and b/multisrc/overrides/madara/mangabee/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangabee/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/mangabee/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..31e8ceb2fa
Binary files /dev/null and b/multisrc/overrides/madara/mangabee/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangabee/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangabee/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..3ad483f5ba
Binary files /dev/null and b/multisrc/overrides/madara/mangabee/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangabee/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangabee/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..775c3c6b6a
Binary files /dev/null and b/multisrc/overrides/madara/mangabee/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangabee/res/web_hi_res_512.png b/multisrc/overrides/madara/mangabee/res/web_hi_res_512.png
new file mode 100644
index 0000000000..cc60e72e2d
Binary files /dev/null and b/multisrc/overrides/madara/mangabee/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/mangabee/src/MangaBee.kt b/multisrc/overrides/madara/mangabee/src/MangaBee.kt
new file mode 100644
index 0000000000..9a80c001c6
--- /dev/null
+++ b/multisrc/overrides/madara/mangabee/src/MangaBee.kt
@@ -0,0 +1,17 @@
+package eu.kanade.tachiyomi.extension.en.mangabee
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+import java.text.SimpleDateFormat
+import java.util.Locale
+
+class MangaBee : Madara(
+ "Manga Bee",
+ "https://mangabee.net",
+ "en",
+ dateFormat = SimpleDateFormat("MM/dd/yyyy", Locale.ROOT),
+) {
+ 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/mangabilgini/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/mangabilgini/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index f14515d90b..0000000000
Binary files a/multisrc/overrides/madara/mangabilgini/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/mangabilgini/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/mangabilgini/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index 266b5527f6..0000000000
Binary files a/multisrc/overrides/madara/mangabilgini/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/mangabilgini/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/mangabilgini/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index aab5aecb1b..0000000000
Binary files a/multisrc/overrides/madara/mangabilgini/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/mangabilgini/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangabilgini/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 56cac9f444..0000000000
Binary files a/multisrc/overrides/madara/mangabilgini/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/mangabilgini/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangabilgini/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 0efbad0854..0000000000
Binary files a/multisrc/overrides/madara/mangabilgini/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/mangabilgini/res/web_hi_res_512.png b/multisrc/overrides/madara/mangabilgini/res/web_hi_res_512.png
deleted file mode 100644
index 1e901e7cec..0000000000
Binary files a/multisrc/overrides/madara/mangabilgini/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/madara/mangabilgini/src/MangaBilgini.kt b/multisrc/overrides/madara/mangabilgini/src/MangaBilgini.kt
deleted file mode 100644
index 47c51c4192..0000000000
--- a/multisrc/overrides/madara/mangabilgini/src/MangaBilgini.kt
+++ /dev/null
@@ -1,14 +0,0 @@
-package eu.kanade.tachiyomi.extension.tr.mangabilgini
-
-import eu.kanade.tachiyomi.multisrc.madara.Madara
-import java.text.SimpleDateFormat
-import java.util.Locale
-
-class MangaBilgini : Madara(
- "Manga Bilgini",
- "https://mangabilgini.com",
- "tr",
- dateFormat = SimpleDateFormat("MMM d, yyy", Locale("tr")),
-) {
- override val useNewChapterEndpoint = false
-}
diff --git a/multisrc/overrides/madara/mangaclashtv/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/mangaclashtv/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..9c6e5e1808
Binary files /dev/null and b/multisrc/overrides/madara/mangaclashtv/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangaclashtv/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/mangaclashtv/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..125060730d
Binary files /dev/null and b/multisrc/overrides/madara/mangaclashtv/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangaclashtv/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/mangaclashtv/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..1cab39ea25
Binary files /dev/null and b/multisrc/overrides/madara/mangaclashtv/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangaclashtv/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangaclashtv/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..eec512f713
Binary files /dev/null and b/multisrc/overrides/madara/mangaclashtv/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangaclashtv/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangaclashtv/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..30ba26fdfe
Binary files /dev/null and b/multisrc/overrides/madara/mangaclashtv/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangaclashtv/res/web_hi_res_512.png b/multisrc/overrides/madara/mangaclashtv/res/web_hi_res_512.png
new file mode 100644
index 0000000000..b64f6b9565
Binary files /dev/null and b/multisrc/overrides/madara/mangaclashtv/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/mangaclashtv/src/MangaClashTv.kt b/multisrc/overrides/madara/mangaclashtv/src/MangaClashTv.kt
new file mode 100644
index 0000000000..9f85cc2176
--- /dev/null
+++ b/multisrc/overrides/madara/mangaclashtv/src/MangaClashTv.kt
@@ -0,0 +1,9 @@
+package eu.kanade.tachiyomi.extension.en.mangaclashtv
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+
+class MangaClashTv : Madara("MangaClash.tv (unoriginal)", "https://mangaclash.tv", "en") {
+ override val useNewChapterEndpoint = false
+
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
+}
diff --git a/multisrc/overrides/madara/mangacrab/src/MangaCrab.kt b/multisrc/overrides/madara/mangacrab/src/MangaCrab.kt
index d5333863c9..16d44f2348 100644
--- a/multisrc/overrides/madara/mangacrab/src/MangaCrab.kt
+++ b/multisrc/overrides/madara/mangacrab/src/MangaCrab.kt
@@ -7,7 +7,7 @@ import java.util.Locale
class MangaCrab : Madara(
"Manga Crab",
- "https://mangacrab.com",
+ "https://mangacrab3.com",
"es",
SimpleDateFormat("dd/MM/yyyy", Locale("es")),
) {
@@ -15,6 +15,8 @@ class MangaCrab : Madara(
.rateLimit(1, 2)
.build()
+ override val mangaSubString = "series"
+
override fun chapterListSelector() = "div.listing-chapters_wrap > ul > li"
- override val mangaDetailsSelectorDescription = "div.c-page__content div.contenedor"
+ override val mangaDetailsSelectorDescription = "div.c-page__content div.modal-contenido"
}
diff --git a/multisrc/overrides/madara/mangacrazy/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/mangacrazy/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..b14dad52b4
Binary files /dev/null and b/multisrc/overrides/madara/mangacrazy/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangacrazy/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/mangacrazy/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..4905f2c0b6
Binary files /dev/null and b/multisrc/overrides/madara/mangacrazy/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangacrazy/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/mangacrazy/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..3f3b88fe22
Binary files /dev/null and b/multisrc/overrides/madara/mangacrazy/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangacrazy/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangacrazy/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..1f6922f2e1
Binary files /dev/null and b/multisrc/overrides/madara/mangacrazy/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangacrazy/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangacrazy/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..975a5ff3e1
Binary files /dev/null and b/multisrc/overrides/madara/mangacrazy/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangacrazy/res/web_hi_res_512.png b/multisrc/overrides/madara/mangacrazy/res/web_hi_res_512.png
new file mode 100644
index 0000000000..2880c3b52b
Binary files /dev/null and b/multisrc/overrides/madara/mangacrazy/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/mangacrazy/src/MangaCrazy.kt b/multisrc/overrides/madara/mangacrazy/src/MangaCrazy.kt
new file mode 100644
index 0000000000..c9fbab93f8
--- /dev/null
+++ b/multisrc/overrides/madara/mangacrazy/src/MangaCrazy.kt
@@ -0,0 +1,9 @@
+package eu.kanade.tachiyomi.extension.all.mangacrazy
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+
+class MangaCrazy : Madara("MangaCrazy", "https://mangacrazy.net", "all") {
+ override val useNewChapterEndpoint = true
+
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
+}
diff --git a/multisrc/overrides/madara/mangadash1001com/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/mangadash1001com/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..33f91b06d4
Binary files /dev/null and b/multisrc/overrides/madara/mangadash1001com/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangadash1001com/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/mangadash1001com/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..8a97e25b44
Binary files /dev/null and b/multisrc/overrides/madara/mangadash1001com/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangadash1001com/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/mangadash1001com/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..65907a275b
Binary files /dev/null and b/multisrc/overrides/madara/mangadash1001com/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangadash1001com/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangadash1001com/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..426772bfac
Binary files /dev/null and b/multisrc/overrides/madara/mangadash1001com/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangadash1001com/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangadash1001com/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..109ecc4dd3
Binary files /dev/null and b/multisrc/overrides/madara/mangadash1001com/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangadash1001com/res/web_hi_res_512.png b/multisrc/overrides/madara/mangadash1001com/res/web_hi_res_512.png
new file mode 100644
index 0000000000..a2cb2b9862
Binary files /dev/null and b/multisrc/overrides/madara/mangadash1001com/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/mangadash1001com/src/MangaDash1001Com.kt b/multisrc/overrides/madara/mangadash1001com/src/MangaDash1001Com.kt
new file mode 100644
index 0000000000..88b3cd0ead
--- /dev/null
+++ b/multisrc/overrides/madara/mangadash1001com/src/MangaDash1001Com.kt
@@ -0,0 +1,9 @@
+package eu.kanade.tachiyomi.extension.en.mangadash1001com
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+
+class MangaDash1001Com : Madara("Manga-1001.com", "https://manga-1001.com", "en") {
+ override val useNewChapterEndpoint = false
+
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
+}
diff --git a/multisrc/overrides/madara/mangadinotop/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/mangadinotop/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..d8bbacd490
Binary files /dev/null and b/multisrc/overrides/madara/mangadinotop/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangadinotop/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/mangadinotop/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..ec35ead1d0
Binary files /dev/null and b/multisrc/overrides/madara/mangadinotop/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangadinotop/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/mangadinotop/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..bd959ac04d
Binary files /dev/null and b/multisrc/overrides/madara/mangadinotop/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangadinotop/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangadinotop/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..58989ca02b
Binary files /dev/null and b/multisrc/overrides/madara/mangadinotop/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangadinotop/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangadinotop/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..3ae51ec0a2
Binary files /dev/null and b/multisrc/overrides/madara/mangadinotop/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangadinotop/res/web_hi_res_512.png b/multisrc/overrides/madara/mangadinotop/res/web_hi_res_512.png
new file mode 100644
index 0000000000..a624bd17dd
Binary files /dev/null and b/multisrc/overrides/madara/mangadinotop/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/mangadinotop/src/MangaDinoTop.kt b/multisrc/overrides/madara/mangadinotop/src/MangaDinoTop.kt
new file mode 100644
index 0000000000..ef4d3cce17
--- /dev/null
+++ b/multisrc/overrides/madara/mangadinotop/src/MangaDinoTop.kt
@@ -0,0 +1,9 @@
+package eu.kanade.tachiyomi.extension.en.mangadinotop
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+
+class MangaDinoTop : Madara("MangaDino.top (unoriginal)", "https://mangadino.top", "en") {
+ override val useNewChapterEndpoint = false
+
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
+}
diff --git a/multisrc/overrides/madara/mangadistrict/src/MangaDistrict.kt b/multisrc/overrides/madara/mangadistrict/src/MangaDistrict.kt
index 5f10b78e60..515e522955 100644
--- a/multisrc/overrides/madara/mangadistrict/src/MangaDistrict.kt
+++ b/multisrc/overrides/madara/mangadistrict/src/MangaDistrict.kt
@@ -1,12 +1,11 @@
package eu.kanade.tachiyomi.extension.en.mangadistrict
import eu.kanade.tachiyomi.multisrc.madara.Madara
-import java.text.SimpleDateFormat
-import java.util.Locale
class MangaDistrict : Madara(
"Manga District",
"https://mangadistrict.com",
"en",
- dateFormat = SimpleDateFormat("MMM d, yyyy", Locale.US),
-)
+) {
+ override fun searchMangaNextPageSelector() = "div[role=navigation] a.last"
+}
diff --git a/multisrc/overrides/madara/mangadods/src/MangaDods.kt b/multisrc/overrides/madara/mangadods/src/MangaDods.kt
index 1ae4bcf2c9..777e228ad1 100644
--- a/multisrc/overrides/madara/mangadods/src/MangaDods.kt
+++ b/multisrc/overrides/madara/mangadods/src/MangaDods.kt
@@ -4,4 +4,12 @@ import eu.kanade.tachiyomi.multisrc.madara.Madara
import java.text.SimpleDateFormat
import java.util.Locale
-class MangaDods : Madara("MangaDods", "https://www.mangadods.com", "en", SimpleDateFormat("yyyy-MM-dd", Locale.US))
+class MangaDods : Madara("MangaDods", "https://mangadods.com", "en", SimpleDateFormat("dd-MMM", Locale.US)) {
+ override val useNewChapterEndpoint = true
+
+ override val chapterUrlSelector = "a:not([style])"
+
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
+
+ override fun chapterDateSelector() = "span i"
+}
diff --git a/multisrc/overrides/madara/mangafenix/src/MangaFenix.kt b/multisrc/overrides/madara/mangafenix/src/MangaFenix.kt
index 5716d90f3e..ba431a7dbf 100644
--- a/multisrc/overrides/madara/mangafenix/src/MangaFenix.kt
+++ b/multisrc/overrides/madara/mangafenix/src/MangaFenix.kt
@@ -8,7 +8,7 @@ import java.util.Locale
class MangaFenix : Madara(
"Manga Fenix",
- "https://manga-fenix.com",
+ "https://manhua-fenix.com",
"es",
SimpleDateFormat("dd MMMM, yyyy", Locale("es")),
) {
diff --git a/multisrc/overrides/madara/mangagoyaoi/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/mangagoyaoi/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..09983f687e
Binary files /dev/null and b/multisrc/overrides/madara/mangagoyaoi/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangagoyaoi/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/mangagoyaoi/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..77e4aa64fd
Binary files /dev/null and b/multisrc/overrides/madara/mangagoyaoi/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangagoyaoi/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/mangagoyaoi/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..d95dc46ab9
Binary files /dev/null and b/multisrc/overrides/madara/mangagoyaoi/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangagoyaoi/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangagoyaoi/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..ec53998fe8
Binary files /dev/null and b/multisrc/overrides/madara/mangagoyaoi/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangagoyaoi/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangagoyaoi/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..29d1ba100c
Binary files /dev/null and b/multisrc/overrides/madara/mangagoyaoi/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangagoyaoi/res/web_hi_res_512.png b/multisrc/overrides/madara/mangagoyaoi/res/web_hi_res_512.png
new file mode 100644
index 0000000000..a9978cae15
Binary files /dev/null and b/multisrc/overrides/madara/mangagoyaoi/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/mangagoyaoi/src/MangaGoYaoi.kt b/multisrc/overrides/madara/mangagoyaoi/src/MangaGoYaoi.kt
new file mode 100644
index 0000000000..ec62c7bc45
--- /dev/null
+++ b/multisrc/overrides/madara/mangagoyaoi/src/MangaGoYaoi.kt
@@ -0,0 +1,9 @@
+package eu.kanade.tachiyomi.extension.en.mangagoyaoi
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+
+class MangaGoYaoi : Madara("MangaGo Yaoi", "https://mangagoyaoi.com", "en") {
+ override val useNewChapterEndpoint = true
+
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
+}
diff --git a/multisrc/overrides/madara/mangagreat/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/mangagreat/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index c153fca913..0000000000
Binary files a/multisrc/overrides/madara/mangagreat/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/mangagreat/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/mangagreat/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index 5773957bb7..0000000000
Binary files a/multisrc/overrides/madara/mangagreat/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/mangagreat/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/mangagreat/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index b23c047536..0000000000
Binary files a/multisrc/overrides/madara/mangagreat/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/mangagreat/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangagreat/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index a0bac61ee7..0000000000
Binary files a/multisrc/overrides/madara/mangagreat/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/mangagreat/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangagreat/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index b1e1803171..0000000000
Binary files a/multisrc/overrides/madara/mangagreat/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/mangagreat/res/web_hi_res_512.png b/multisrc/overrides/madara/mangagreat/res/web_hi_res_512.png
deleted file mode 100644
index bae60d6b49..0000000000
Binary files a/multisrc/overrides/madara/mangagreat/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/madara/mangagreat/src/MangaGreat.kt b/multisrc/overrides/madara/mangagreat/src/MangaGreat.kt
deleted file mode 100644
index 6fddf8cf06..0000000000
--- a/multisrc/overrides/madara/mangagreat/src/MangaGreat.kt
+++ /dev/null
@@ -1,9 +0,0 @@
-package eu.kanade.tachiyomi.extension.en.mangagreat
-
-import eu.kanade.tachiyomi.multisrc.madara.Madara
-
-class MangaGreat : Madara("MangaGreat", "https://mangagreat.com", "en") {
-
- // The website does not flag the content.
- override val filterNonMangaItems = false
-}
diff --git a/multisrc/overrides/madara/mangahentai/src/MangaHentai.kt b/multisrc/overrides/madara/mangahentai/src/MangaHentai.kt
index 808ed82985..3d5de98bd5 100644
--- a/multisrc/overrides/madara/mangahentai/src/MangaHentai.kt
+++ b/multisrc/overrides/madara/mangahentai/src/MangaHentai.kt
@@ -3,5 +3,9 @@ package eu.kanade.tachiyomi.extension.en.mangahentai
import eu.kanade.tachiyomi.multisrc.madara.Madara
class MangaHentai : Madara("Manga Hentai", "https://mangahentai.me", "en") {
+ override val mangaSubString = "manga-hentai"
+
override val useNewChapterEndpoint: Boolean = true
+
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
}
diff --git a/multisrc/overrides/madara/mangahubfr/src/MangaHubFr.kt b/multisrc/overrides/madara/mangahubfr/src/MangaHubFr.kt
index 4cb3a70404..2794d135b1 100644
--- a/multisrc/overrides/madara/mangahubfr/src/MangaHubFr.kt
+++ b/multisrc/overrides/madara/mangahubfr/src/MangaHubFr.kt
@@ -1,9 +1,25 @@
package eu.kanade.tachiyomi.extension.fr.mangahubfr
import eu.kanade.tachiyomi.multisrc.madara.Madara
+import eu.kanade.tachiyomi.source.model.Page
+import org.jsoup.nodes.Document
import java.text.SimpleDateFormat
import java.util.Locale
class MangaHubFr : Madara("MangaHub.fr", "https://mangahub.fr", "fr", dateFormat = SimpleDateFormat("d MMMM yyyy", Locale.FRENCH)) {
- override fun chapterListSelector() = "li.wp-mangas-chapters"
+ // Only display chapters which don't have Premium
+ override fun chapterListSelector() = "li.wp-manga-chapter:not(.vip-permission)"
+
+ override val chapterUrlSuffix = ""
+
+ override fun pageListParse(document: Document): List {
+ countViews(document)
+
+ return document.select(pageListParseSelector)
+ .mapIndexed { index, element ->
+ // Had to add trim because of white space in source.
+ val imageUrl = element.select("img").attr("abs:src").trim()
+ Page(index, document.location(), imageUrl)
+ }
+ }
}
diff --git a/multisrc/overrides/madara/mangakakalotio/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/mangakakalotio/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..397ccc6d19
Binary files /dev/null and b/multisrc/overrides/madara/mangakakalotio/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangakakalotio/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/mangakakalotio/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..67bbbe769a
Binary files /dev/null and b/multisrc/overrides/madara/mangakakalotio/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangakakalotio/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/mangakakalotio/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..b51b2f7b04
Binary files /dev/null and b/multisrc/overrides/madara/mangakakalotio/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangakakalotio/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangakakalotio/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..4ae5101959
Binary files /dev/null and b/multisrc/overrides/madara/mangakakalotio/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangakakalotio/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangakakalotio/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..4449730233
Binary files /dev/null and b/multisrc/overrides/madara/mangakakalotio/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangakakalotio/res/web_hi_res_512.png b/multisrc/overrides/madara/mangakakalotio/res/web_hi_res_512.png
new file mode 100644
index 0000000000..202ad7c00b
Binary files /dev/null and b/multisrc/overrides/madara/mangakakalotio/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/mangakakalotio/src/MangakakalotIo.kt b/multisrc/overrides/madara/mangakakalotio/src/MangakakalotIo.kt
new file mode 100644
index 0000000000..be17512b48
--- /dev/null
+++ b/multisrc/overrides/madara/mangakakalotio/src/MangakakalotIo.kt
@@ -0,0 +1,9 @@
+package eu.kanade.tachiyomi.extension.en.mangakakalotio
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+
+class MangakakalotIo : Madara("Mangakakalot.io (unoriginal)", "https://mangakakalot.io", "en") {
+ override val useNewChapterEndpoint = false
+
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
+}
diff --git a/multisrc/overrides/madara/mangakakalotone/src/MangakakalotOne.kt b/multisrc/overrides/madara/mangakakalotone/src/MangakakalotOne.kt
new file mode 100644
index 0000000000..b82935347e
--- /dev/null
+++ b/multisrc/overrides/madara/mangakakalotone/src/MangakakalotOne.kt
@@ -0,0 +1,9 @@
+package eu.kanade.tachiyomi.extension.en.mangakakalotone
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+
+class MangakakalotOne : Madara("Mangakakalot.one (unoriginal)", "https://mangakakalot.one", "en") {
+ override val useNewChapterEndpoint = true
+
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
+}
diff --git a/multisrc/overrides/madara/mangakio/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/mangakio/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index bc75d71472..0000000000
Binary files a/multisrc/overrides/madara/mangakio/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/mangakio/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/mangakio/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index ba32c2e054..0000000000
Binary files a/multisrc/overrides/madara/mangakio/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/mangakio/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/mangakio/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 418f7e546d..0000000000
Binary files a/multisrc/overrides/madara/mangakio/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/mangakio/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangakio/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 87eebefaa7..0000000000
Binary files a/multisrc/overrides/madara/mangakio/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/mangakio/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangakio/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 2eecfc87d6..0000000000
Binary files a/multisrc/overrides/madara/mangakio/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/mangakio/res/web_hi_res_512.png b/multisrc/overrides/madara/mangakio/res/web_hi_res_512.png
deleted file mode 100644
index d7be8a5dcd..0000000000
Binary files a/multisrc/overrides/madara/mangakio/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/madara/mangakio/src/MangaKio.kt b/multisrc/overrides/madara/mangakio/src/MangaKio.kt
deleted file mode 100644
index 967e096554..0000000000
--- a/multisrc/overrides/madara/mangakio/src/MangaKio.kt
+++ /dev/null
@@ -1,14 +0,0 @@
-package eu.kanade.tachiyomi.extension.en.mangakio
-
-import eu.kanade.tachiyomi.multisrc.madara.Madara
-import java.text.SimpleDateFormat
-import java.util.Locale
-
-class MangaKio : Madara(
- "Manga Kio",
- "https://mangakio.com",
- "en",
- dateFormat = SimpleDateFormat("MMM d, yyyy", Locale.US),
-) {
- override val useNewChapterEndpoint = true
-}
diff --git a/multisrc/overrides/madara/mangakitsu/src/MangaKitsu.kt b/multisrc/overrides/madara/mangakitsu/src/MangaKitsu.kt
new file mode 100644
index 0000000000..db609628e7
--- /dev/null
+++ b/multisrc/overrides/madara/mangakitsu/src/MangaKitsu.kt
@@ -0,0 +1,10 @@
+package eu.kanade.tachiyomi.extension.en.mangakitsu
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+
+class MangaKitsu : Madara("Manga Kitsu", "https://mangakitsu.com", "en") {
+ override val useNewChapterEndpoint = 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/mangaland/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/mangaland/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..5223ee1804
Binary files /dev/null and b/multisrc/overrides/madara/mangaland/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangaland/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/mangaland/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..a97240fc84
Binary files /dev/null and b/multisrc/overrides/madara/mangaland/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangaland/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/mangaland/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..d02e32ebe7
Binary files /dev/null and b/multisrc/overrides/madara/mangaland/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangaland/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangaland/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..6ed828bb15
Binary files /dev/null and b/multisrc/overrides/madara/mangaland/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangaland/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangaland/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..5a7f9e377d
Binary files /dev/null and b/multisrc/overrides/madara/mangaland/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangaland/res/web_hi_res_512.png b/multisrc/overrides/madara/mangaland/res/web_hi_res_512.png
new file mode 100644
index 0000000000..e7d3a3f408
Binary files /dev/null and b/multisrc/overrides/madara/mangaland/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/mangaland/src/Mangaland.kt b/multisrc/overrides/madara/mangaland/src/Mangaland.kt
new file mode 100644
index 0000000000..caafbe629c
--- /dev/null
+++ b/multisrc/overrides/madara/mangaland/src/Mangaland.kt
@@ -0,0 +1,61 @@
+package eu.kanade.tachiyomi.extension.es.mangaland
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+import eu.kanade.tachiyomi.network.POST
+import eu.kanade.tachiyomi.network.interceptor.rateLimit
+import okhttp3.FormBody
+import okhttp3.Request
+import java.text.SimpleDateFormat
+import java.util.Locale
+import java.util.concurrent.TimeUnit
+
+class Mangaland : Madara(
+ "Mangaland",
+ "https://mangaland.net",
+ "es",
+ SimpleDateFormat("MMMM dd, yyyy", Locale("es")),
+) {
+ override val client = super.client.newBuilder()
+ .rateLimit(2, 1, TimeUnit.SECONDS)
+ .build()
+
+ override val useNewChapterEndpoint = true
+
+ override fun popularMangaNextPageSelector() = "body:not(:has(.no-posts))"
+
+ private fun loadMoreRequest(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]", "full")
+ add("vars[meta_query][0][0][key]", "_wp_manga_chapter_type")
+ add("vars[meta_query][0][0][value]", "manga")
+ add("vars[meta_query][0][relation]", "AND")
+ add("vars[meta_query][relation]", "AND")
+ add("vars[post_type]", "wp-manga")
+ add("vars[post_status]", "publish")
+ add("vars[meta_key]", metaKey)
+ add("vars[manga_archives_item_layout]", "big_thumbnail")
+ }.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 loadMoreRequest(page - 1, "_wp_manga_views")
+ }
+
+ override fun latestUpdatesRequest(page: Int): Request {
+ return loadMoreRequest(page - 1, "_latest_update")
+ }
+}
diff --git a/multisrc/overrides/madara/mangalek/src/Mangalek.kt b/multisrc/overrides/madara/mangalek/src/Mangalek.kt
index 1e2ccdf0ee..bc5611341d 100644
--- a/multisrc/overrides/madara/mangalek/src/Mangalek.kt
+++ b/multisrc/overrides/madara/mangalek/src/Mangalek.kt
@@ -1,10 +1,116 @@
package eu.kanade.tachiyomi.extension.ar.mangalek
+import android.app.Application
+import android.content.SharedPreferences
+import android.widget.Toast
+import androidx.preference.PreferenceScreen
+import eu.kanade.tachiyomi.extension.BuildConfig
import eu.kanade.tachiyomi.multisrc.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.MangasPage
+import eu.kanade.tachiyomi.source.model.SManga
+import kotlinx.serialization.Serializable
+import kotlinx.serialization.decodeFromString
+import okhttp3.CacheControl
+import okhttp3.FormBody
+import okhttp3.Request
+import okhttp3.Response
+import uy.kohesive.injekt.Injekt
+import uy.kohesive.injekt.api.get
import java.text.SimpleDateFormat
import java.util.Locale
-class Mangalek : Madara("مانجا ليك", "https://mangalek.com", "ar", SimpleDateFormat("MMMM dd, yyyy", Locale("ar"))) {
+class Mangalek : Madara("مانجا ليك", "https://manga-lek.net", "ar", SimpleDateFormat("MMMM dd, yyyy", Locale("ar"))) {
override val chapterUrlSuffix = ""
+
+ private val defaultBaseUrl = "https://manga-lek.net"
+ override val baseUrl by lazy { getPrefBaseUrl() }
+
+ private val preferences: SharedPreferences by lazy {
+ Injekt.get().getSharedPreferences("source_$id", 0x0000)
+ }
+
+ companion object {
+ private const val RESTART_TACHIYOMI = ".لتطبيق الإعدادات الجديدة Tachiyomi أعد تشغيل"
+ private const val BASE_URL_PREF_TITLE = "تعديل الرابط"
+ private const val BASE_URL_PREF = "overrideBaseUrl_v${BuildConfig.VERSION_CODE}"
+ private const val BASE_URL_PREF_SUMMARY = ".للاستخدام المؤقت. تحديث التطبيق سيؤدي الى حذف الإعدادات"
+ }
+
+ override fun setupPreferenceScreen(screen: PreferenceScreen) {
+ val baseUrlPref = androidx.preference.EditTextPreference(screen.context).apply {
+ key = BASE_URL_PREF
+ title = BASE_URL_PREF_TITLE
+ summary = BASE_URL_PREF_SUMMARY
+ this.setDefaultValue(defaultBaseUrl)
+ dialogTitle = BASE_URL_PREF_TITLE
+ dialogMessage = "Default: $defaultBaseUrl"
+
+ setOnPreferenceChangeListener { _, _ ->
+ Toast.makeText(screen.context, RESTART_TACHIYOMI, Toast.LENGTH_LONG).show()
+ true
+ }
+ }
+ screen.addPreference(baseUrlPref)
+
+ super.setupPreferenceScreen(screen)
+ }
+
+ private fun getPrefBaseUrl(): String = preferences.getString(BASE_URL_PREF, defaultBaseUrl)!!
+
+ override fun popularMangaRequest(page: Int): Request {
+ return GET(
+ url = "$baseUrl/$mangaSubString/${searchPage(page)}",
+ headers = headers,
+ cache = CacheControl.FORCE_NETWORK,
+ )
+ }
+
+ override fun latestUpdatesRequest(page: Int): Request = popularMangaRequest(page)
+
+ override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request =
+ POST(
+ "$baseUrl/wp-admin/admin-ajax.php",
+ headers,
+ FormBody.Builder()
+ .add("action", "wp-manga-search-manga")
+ .add("title", query)
+ .build(),
+ )
+
+ private inline fun Response.parseAs(): T {
+ return json.decodeFromString(body.string())
+ }
+
+ @Serializable
+ data class SearchResponseDto(
+ val data: List,
+ val success: Boolean,
+ )
+
+ @Serializable
+ data class SearchEntryDto(
+ val url: String = "",
+ val title: String = "",
+ )
+
+ override fun searchMangaParse(response: Response): MangasPage {
+ val dto = response.parseAs()
+
+ if (!dto.success) {
+ return MangasPage(emptyList(), false)
+ }
+
+ val manga = dto.data.map {
+ SManga.create().apply {
+ setUrlWithoutDomain(it.url)
+ title = it.title
+ }
+ }
+
+ return MangasPage(manga, false)
+ }
}
diff --git a/multisrc/overrides/madara/mangaleks/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/mangaleks/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..348915430d
Binary files /dev/null and b/multisrc/overrides/madara/mangaleks/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangaleks/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/mangaleks/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..345012bc3d
Binary files /dev/null and b/multisrc/overrides/madara/mangaleks/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangaleks/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/mangaleks/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..2e7af18d5f
Binary files /dev/null and b/multisrc/overrides/madara/mangaleks/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangaleks/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangaleks/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..7ae8ef32a7
Binary files /dev/null and b/multisrc/overrides/madara/mangaleks/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangaleks/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangaleks/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..8843070919
Binary files /dev/null and b/multisrc/overrides/madara/mangaleks/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangaleks/res/web_hi_res_512.png b/multisrc/overrides/madara/mangaleks/res/web_hi_res_512.png
new file mode 100644
index 0000000000..242a833dac
Binary files /dev/null and b/multisrc/overrides/madara/mangaleks/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/mangaleks/src/MangaLeks.kt b/multisrc/overrides/madara/mangaleks/src/MangaLeks.kt
new file mode 100644
index 0000000000..c17a92efb1
--- /dev/null
+++ b/multisrc/overrides/madara/mangaleks/src/MangaLeks.kt
@@ -0,0 +1,20 @@
+package eu.kanade.tachiyomi.extension.ar.mangaleks
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+import java.text.SimpleDateFormat
+import java.util.Locale
+
+class MangaLeks : Madara(
+ "مانجا ليكس",
+ "https://mangaleks.com",
+ "ar",
+ SimpleDateFormat("dd/MM/yyyy", Locale.ENGLISH),
+) {
+ override fun searchPage(page: Int): String {
+ return if (page > 1) {
+ "page/$page/"
+ } else {
+ ""
+ }
+ }
+}
diff --git a/multisrc/overrides/madara/mangalionz/src/MangaLionz.kt b/multisrc/overrides/madara/mangalionz/src/MangaLionz.kt
index 75180ac696..908bedc820 100644
--- a/multisrc/overrides/madara/mangalionz/src/MangaLionz.kt
+++ b/multisrc/overrides/madara/mangalionz/src/MangaLionz.kt
@@ -4,7 +4,7 @@ import eu.kanade.tachiyomi.multisrc.madara.Madara
import eu.kanade.tachiyomi.source.model.SManga
import org.jsoup.nodes.Element
-class MangaLionz : Madara("MangaLionz", "https://mangalionz.com", "ar") {
+class MangaLionz : Madara("MangaLionz", "https://mangalionz.org", "ar") {
override fun popularMangaFromElement(element: Element): SManga {
val manga = SManga.create()
diff --git a/multisrc/overrides/madara/mangamammy/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/mangamammy/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..652f6cc073
Binary files /dev/null and b/multisrc/overrides/madara/mangamammy/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangamammy/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/mangamammy/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..f810ec5566
Binary files /dev/null and b/multisrc/overrides/madara/mangamammy/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangamammy/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/mangamammy/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..c074271fb0
Binary files /dev/null and b/multisrc/overrides/madara/mangamammy/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangamammy/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangamammy/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..d5d3a60485
Binary files /dev/null and b/multisrc/overrides/madara/mangamammy/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangamammy/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangamammy/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..219a3c8960
Binary files /dev/null and b/multisrc/overrides/madara/mangamammy/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangamammy/res/web_hi_res_512.png b/multisrc/overrides/madara/mangamammy/res/web_hi_res_512.png
new file mode 100644
index 0000000000..afa9890917
Binary files /dev/null and b/multisrc/overrides/madara/mangamammy/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/mangamammy/src/MangaMammy.kt b/multisrc/overrides/madara/mangamammy/src/MangaMammy.kt
new file mode 100644
index 0000000000..a477f0846b
--- /dev/null
+++ b/multisrc/overrides/madara/mangamammy/src/MangaMammy.kt
@@ -0,0 +1,56 @@
+package eu.kanade.tachiyomi.extension.ru.mangamammy
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+import eu.kanade.tachiyomi.source.model.FilterList
+import okhttp3.Request
+import java.text.SimpleDateFormat
+import java.util.Locale
+
+class MangaMammy : Madara(
+ "Manga Mammy",
+ "https://mangamammy.ru",
+ "ru",
+ dateFormat = SimpleDateFormat("dd.MM.yyyy", Locale.ROOT),
+) {
+ override val useNewChapterEndpoint = true
+
+ 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/mangamanhua/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/mangamanhua/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index 740450db30..0000000000
Binary files a/multisrc/overrides/madara/mangamanhua/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/mangamanhua/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/mangamanhua/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index e0a3ca109f..0000000000
Binary files a/multisrc/overrides/madara/mangamanhua/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/mangamanhua/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/mangamanhua/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 628e2cc88f..0000000000
Binary files a/multisrc/overrides/madara/mangamanhua/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/mangamanhua/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangamanhua/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index a79191fe76..0000000000
Binary files a/multisrc/overrides/madara/mangamanhua/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/mangamanhua/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangamanhua/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 58fc1cfb87..0000000000
Binary files a/multisrc/overrides/madara/mangamanhua/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/mangamanhua/res/web_hi_res_512.png b/multisrc/overrides/madara/mangamanhua/res/web_hi_res_512.png
deleted file mode 100644
index d4c64c7da3..0000000000
Binary files a/multisrc/overrides/madara/mangamanhua/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/madara/mangamanhua/src/MangaManhua.kt b/multisrc/overrides/madara/mangamanhua/src/MangaManhua.kt
deleted file mode 100644
index 6765b1f033..0000000000
--- a/multisrc/overrides/madara/mangamanhua/src/MangaManhua.kt
+++ /dev/null
@@ -1,7 +0,0 @@
-package eu.kanade.tachiyomi.extension.en.mangamanhua
-
-import eu.kanade.tachiyomi.multisrc.madara.Madara
-import java.text.SimpleDateFormat
-import java.util.Locale
-
-class MangaManhua : Madara("MangaManhua", "https://mangamanhua.online", "en", SimpleDateFormat("d MMMM'،' yyyy", Locale.US))
diff --git a/multisrc/overrides/madara/mangame/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/mangame/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index 6b9ced9363..0000000000
Binary files a/multisrc/overrides/madara/mangame/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/mangame/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/mangame/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index 45e9b09c60..0000000000
Binary files a/multisrc/overrides/madara/mangame/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/mangame/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/mangame/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 1e2c0bb4ae..0000000000
Binary files a/multisrc/overrides/madara/mangame/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/mangame/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangame/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 05deb3fe4d..0000000000
Binary files a/multisrc/overrides/madara/mangame/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/mangame/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangame/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index c0c9c5b7db..0000000000
Binary files a/multisrc/overrides/madara/mangame/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/mangame/res/web_hi_res_512.png b/multisrc/overrides/madara/mangame/res/web_hi_res_512.png
deleted file mode 100644
index ce80be44e4..0000000000
Binary files a/multisrc/overrides/madara/mangame/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/madara/mangame/src/MangaMe.kt b/multisrc/overrides/madara/mangame/src/MangaMe.kt
deleted file mode 100644
index 12eae13578..0000000000
--- a/multisrc/overrides/madara/mangame/src/MangaMe.kt
+++ /dev/null
@@ -1,12 +0,0 @@
-package eu.kanade.tachiyomi.extension.en.mangame
-
-import eu.kanade.tachiyomi.multisrc.madara.Madara
-import java.text.SimpleDateFormat
-import java.util.Locale
-
-class MangaMe : Madara(
- "MangaMe",
- "https://mangame.org",
- "en",
- dateFormat = SimpleDateFormat("dd.MM.yyyy", Locale.US),
-)
diff --git a/multisrc/overrides/madara/mangananquim/src/MangaNanquim.kt b/multisrc/overrides/madara/mangananquim/src/MangaNanquim.kt
new file mode 100644
index 0000000000..6262e90c56
--- /dev/null
+++ b/multisrc/overrides/madara/mangananquim/src/MangaNanquim.kt
@@ -0,0 +1,24 @@
+package eu.kanade.tachiyomi.extension.pt.mangananquim
+
+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 MangaNanquim : Madara(
+ "Mangá Nanquim",
+ "https://mangananquim.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 mangaSubString = "ler-manga"
+
+ override val useNewChapterEndpoint = true
+}
diff --git a/multisrc/overrides/madara/manganelobiz/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/manganelobiz/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..d8bbacd490
Binary files /dev/null and b/multisrc/overrides/madara/manganelobiz/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/manganelobiz/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/manganelobiz/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..ec35ead1d0
Binary files /dev/null and b/multisrc/overrides/madara/manganelobiz/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/manganelobiz/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/manganelobiz/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..bd959ac04d
Binary files /dev/null and b/multisrc/overrides/madara/manganelobiz/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/manganelobiz/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/manganelobiz/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..58989ca02b
Binary files /dev/null and b/multisrc/overrides/madara/manganelobiz/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/manganelobiz/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/manganelobiz/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..3ae51ec0a2
Binary files /dev/null and b/multisrc/overrides/madara/manganelobiz/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/manganelobiz/res/web_hi_res_512.png b/multisrc/overrides/madara/manganelobiz/res/web_hi_res_512.png
new file mode 100644
index 0000000000..a624bd17dd
Binary files /dev/null and b/multisrc/overrides/madara/manganelobiz/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/manganelobiz/src/ManganeloBiz.kt b/multisrc/overrides/madara/manganelobiz/src/ManganeloBiz.kt
new file mode 100644
index 0000000000..81ea5245f6
--- /dev/null
+++ b/multisrc/overrides/madara/manganelobiz/src/ManganeloBiz.kt
@@ -0,0 +1,9 @@
+package eu.kanade.tachiyomi.extension.en.manganelobiz
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+
+class ManganeloBiz : Madara("Manganelo.biz", "https://manganelo.biz", "en") {
+ override val useNewChapterEndpoint = false
+
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
+}
diff --git a/multisrc/overrides/madara/manganelowebsite/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/manganelowebsite/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..03b4a84c38
Binary files /dev/null and b/multisrc/overrides/madara/manganelowebsite/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/manganelowebsite/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/manganelowebsite/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..2706869bb9
Binary files /dev/null and b/multisrc/overrides/madara/manganelowebsite/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/manganelowebsite/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/manganelowebsite/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..982cec3a3d
Binary files /dev/null and b/multisrc/overrides/madara/manganelowebsite/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/manganelowebsite/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/manganelowebsite/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..a20e946d24
Binary files /dev/null and b/multisrc/overrides/madara/manganelowebsite/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/manganelowebsite/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/manganelowebsite/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..839c009e9c
Binary files /dev/null and b/multisrc/overrides/madara/manganelowebsite/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/manganelowebsite/res/web_hi_res_512.png b/multisrc/overrides/madara/manganelowebsite/res/web_hi_res_512.png
new file mode 100644
index 0000000000..c6bad55edb
Binary files /dev/null and b/multisrc/overrides/madara/manganelowebsite/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/manganelowebsite/src/ManganeloWebsite.kt b/multisrc/overrides/madara/manganelowebsite/src/ManganeloWebsite.kt
new file mode 100644
index 0000000000..b4c39d9103
--- /dev/null
+++ b/multisrc/overrides/madara/manganelowebsite/src/ManganeloWebsite.kt
@@ -0,0 +1,9 @@
+package eu.kanade.tachiyomi.extension.en.manganelowebsite
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+
+class ManganeloWebsite : Madara("Manganelo.website (unoriginal)", "https://manganelo.website", "en") {
+ override val useNewChapterEndpoint = false
+
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
+}
diff --git a/multisrc/overrides/madara/manganerds/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/manganerds/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..fb9f9b87b1
Binary files /dev/null and b/multisrc/overrides/madara/manganerds/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/manganerds/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/manganerds/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..8b4ab3601d
Binary files /dev/null and b/multisrc/overrides/madara/manganerds/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/manganerds/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/manganerds/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..8a5ae6a74a
Binary files /dev/null and b/multisrc/overrides/madara/manganerds/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/manganerds/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/manganerds/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..c98a79948d
Binary files /dev/null and b/multisrc/overrides/madara/manganerds/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/manganerds/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/manganerds/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..0214a98821
Binary files /dev/null and b/multisrc/overrides/madara/manganerds/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/manganerds/res/web_hi_res_512.png b/multisrc/overrides/madara/manganerds/res/web_hi_res_512.png
new file mode 100644
index 0000000000..723ae884e0
Binary files /dev/null and b/multisrc/overrides/madara/manganerds/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/manganerds/src/MangaNerds.kt b/multisrc/overrides/madara/manganerds/src/MangaNerds.kt
new file mode 100644
index 0000000000..eb162e60bb
--- /dev/null
+++ b/multisrc/overrides/madara/manganerds/src/MangaNerds.kt
@@ -0,0 +1,9 @@
+package eu.kanade.tachiyomi.extension.en.manganerds
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+
+class MangaNerds : Madara("Manga Nerds", "https://manganerds.com", "en") {
+ override val useNewChapterEndpoint = true
+
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
+}
diff --git a/multisrc/overrides/madara/mangaonlineco/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/mangaonlineco/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index c872377d73..0000000000
Binary files a/multisrc/overrides/madara/mangaonlineco/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/mangaonlineco/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/mangaonlineco/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index 98f0b94832..0000000000
Binary files a/multisrc/overrides/madara/mangaonlineco/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/mangaonlineco/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/mangaonlineco/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index decd54db3b..0000000000
Binary files a/multisrc/overrides/madara/mangaonlineco/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/mangaonlineco/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangaonlineco/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 9ee13e3c39..0000000000
Binary files a/multisrc/overrides/madara/mangaonlineco/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/mangaonlineco/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangaonlineco/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 2732399409..0000000000
Binary files a/multisrc/overrides/madara/mangaonlineco/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/mangaonlineco/res/web_hi_res_512.png b/multisrc/overrides/madara/mangaonlineco/res/web_hi_res_512.png
deleted file mode 100644
index af8adf4234..0000000000
Binary files a/multisrc/overrides/madara/mangaonlineco/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/madara/mangaonlineco/src/MangaOnlineCo.kt b/multisrc/overrides/madara/mangaonlineco/src/MangaOnlineCo.kt
deleted file mode 100644
index c66dfb6fe9..0000000000
--- a/multisrc/overrides/madara/mangaonlineco/src/MangaOnlineCo.kt
+++ /dev/null
@@ -1,11 +0,0 @@
-package eu.kanade.tachiyomi.extension.th.mangaonlineco
-
-import eu.kanade.tachiyomi.multisrc.madara.Madara
-import eu.kanade.tachiyomi.source.model.SChapter
-import okhttp3.Response
-import java.text.SimpleDateFormat
-import java.util.Locale
-
-class MangaOnlineCo : Madara("Manga-Online.co", "https://www.manga-online.co", "th", SimpleDateFormat("MMM dd, yyyy", Locale("th"))) {
- override fun chapterListParse(response: Response): List = super.chapterListParse(response).reversed()
-}
diff --git a/multisrc/overrides/madara/mangaonlineteamunoriginal/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/mangaonlineteamunoriginal/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..e07fbaf126
Binary files /dev/null and b/multisrc/overrides/madara/mangaonlineteamunoriginal/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangaonlineteamunoriginal/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/mangaonlineteamunoriginal/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..6a0426ef1a
Binary files /dev/null and b/multisrc/overrides/madara/mangaonlineteamunoriginal/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangaonlineteamunoriginal/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/mangaonlineteamunoriginal/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..922aef74f2
Binary files /dev/null and b/multisrc/overrides/madara/mangaonlineteamunoriginal/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangaonlineteamunoriginal/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangaonlineteamunoriginal/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..5782860ca6
Binary files /dev/null and b/multisrc/overrides/madara/mangaonlineteamunoriginal/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangaonlineteamunoriginal/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangaonlineteamunoriginal/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..1fab747f49
Binary files /dev/null and b/multisrc/overrides/madara/mangaonlineteamunoriginal/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangaonlineteamunoriginal/res/web_hi_res_512.png b/multisrc/overrides/madara/mangaonlineteamunoriginal/res/web_hi_res_512.png
new file mode 100644
index 0000000000..24c0b68c3b
Binary files /dev/null and b/multisrc/overrides/madara/mangaonlineteamunoriginal/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/mangaonlineteamunoriginal/src/MangaOnlineTeamUnoriginal.kt b/multisrc/overrides/madara/mangaonlineteamunoriginal/src/MangaOnlineTeamUnoriginal.kt
new file mode 100644
index 0000000000..44491dd7bf
--- /dev/null
+++ b/multisrc/overrides/madara/mangaonlineteamunoriginal/src/MangaOnlineTeamUnoriginal.kt
@@ -0,0 +1,9 @@
+package eu.kanade.tachiyomi.extension.en.mangaonlineteamunoriginal
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+
+class MangaOnlineTeamUnoriginal : Madara("MangaOnline.team (unoriginal)", "https://mangaonline.team", "en") {
+ override val useNewChapterEndpoint = false
+
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
+}
diff --git a/multisrc/overrides/madara/mangaowlblog/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/mangaowlblog/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..4862cd83ed
Binary files /dev/null and b/multisrc/overrides/madara/mangaowlblog/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangaowlblog/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/mangaowlblog/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..a8635c99d0
Binary files /dev/null and b/multisrc/overrides/madara/mangaowlblog/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangaowlblog/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/mangaowlblog/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..f74bb6b32a
Binary files /dev/null and b/multisrc/overrides/madara/mangaowlblog/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangaowlblog/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangaowlblog/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..4f46369e89
Binary files /dev/null and b/multisrc/overrides/madara/mangaowlblog/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangaowlblog/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangaowlblog/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..598971deef
Binary files /dev/null and b/multisrc/overrides/madara/mangaowlblog/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangaowlblog/res/web_hi_res_512.png b/multisrc/overrides/madara/mangaowlblog/res/web_hi_res_512.png
new file mode 100644
index 0000000000..29e87c79b7
Binary files /dev/null and b/multisrc/overrides/madara/mangaowlblog/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/mangaowlblog/src/MangaOwlBlog.kt b/multisrc/overrides/madara/mangaowlblog/src/MangaOwlBlog.kt
new file mode 100644
index 0000000000..e51f921831
--- /dev/null
+++ b/multisrc/overrides/madara/mangaowlblog/src/MangaOwlBlog.kt
@@ -0,0 +1,9 @@
+package eu.kanade.tachiyomi.extension.en.mangaowlblog
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+
+class MangaOwlBlog : Madara("MangaOwl.blog (unoriginal)", "https://mangaowl.blog", "en") {
+ override val useNewChapterEndpoint = false
+
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
+}
diff --git a/multisrc/overrides/madara/mangaowlio/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/mangaowlio/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..49bf4a917f
Binary files /dev/null and b/multisrc/overrides/madara/mangaowlio/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangaowlio/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/mangaowlio/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..7951283145
Binary files /dev/null and b/multisrc/overrides/madara/mangaowlio/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangaowlio/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/mangaowlio/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..4f51b0e2bf
Binary files /dev/null and b/multisrc/overrides/madara/mangaowlio/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangaowlio/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangaowlio/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..dcf9aa94fc
Binary files /dev/null and b/multisrc/overrides/madara/mangaowlio/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangaowlio/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangaowlio/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..25b5c27792
Binary files /dev/null and b/multisrc/overrides/madara/mangaowlio/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangaowlio/res/web_hi_res_512.png b/multisrc/overrides/madara/mangaowlio/res/web_hi_res_512.png
new file mode 100644
index 0000000000..1b7dc6b6b7
Binary files /dev/null and b/multisrc/overrides/madara/mangaowlio/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/mangaowlio/src/MangaOwlIo.kt b/multisrc/overrides/madara/mangaowlio/src/MangaOwlIo.kt
new file mode 100644
index 0000000000..8f41cc9f7a
--- /dev/null
+++ b/multisrc/overrides/madara/mangaowlio/src/MangaOwlIo.kt
@@ -0,0 +1,9 @@
+package eu.kanade.tachiyomi.extension.en.mangaowlio
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+
+class MangaOwlIo : Madara("MangaOwl.io (unoriginal)", "https://mangaowl.io", "en") {
+ override val useNewChapterEndpoint = true
+
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
+}
diff --git a/multisrc/overrides/madara/mangaowlone/src/MangaOwlOne.kt b/multisrc/overrides/madara/mangaowlone/src/MangaOwlOne.kt
new file mode 100644
index 0000000000..36d7ad2f64
--- /dev/null
+++ b/multisrc/overrides/madara/mangaowlone/src/MangaOwlOne.kt
@@ -0,0 +1,10 @@
+package eu.kanade.tachiyomi.extension.en.mangaowlone
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+
+class MangaOwlOne : Madara("MangaOwl.one (unoriginal)", "https://mangaowl.one", "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/mangaowlus/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/mangaowlus/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..639597b4cb
Binary files /dev/null and b/multisrc/overrides/madara/mangaowlus/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangaowlus/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/mangaowlus/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..894494f762
Binary files /dev/null and b/multisrc/overrides/madara/mangaowlus/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangaowlus/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/mangaowlus/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..d61ff9e20a
Binary files /dev/null and b/multisrc/overrides/madara/mangaowlus/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangaowlus/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangaowlus/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..2f68aecf16
Binary files /dev/null and b/multisrc/overrides/madara/mangaowlus/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangaowlus/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangaowlus/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..d5f1e7bf4b
Binary files /dev/null and b/multisrc/overrides/madara/mangaowlus/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangaowlus/res/web_hi_res_512.png b/multisrc/overrides/madara/mangaowlus/res/web_hi_res_512.png
new file mode 100644
index 0000000000..7f5c02843b
Binary files /dev/null and b/multisrc/overrides/madara/mangaowlus/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/mangaowlus/src/MangaOwlUs.kt b/multisrc/overrides/madara/mangaowlus/src/MangaOwlUs.kt
new file mode 100644
index 0000000000..4b5dba41b5
--- /dev/null
+++ b/multisrc/overrides/madara/mangaowlus/src/MangaOwlUs.kt
@@ -0,0 +1,9 @@
+package eu.kanade.tachiyomi.extension.en.mangaowlus
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+
+class MangaOwlUs : Madara("MangaOwl.us (unoriginal)", "https://mangaowl.us", "en") {
+ override val useNewChapterEndpoint = true
+
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
+}
diff --git a/multisrc/overrides/madara/mangapure/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/mangapure/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..6bd16fed43
Binary files /dev/null and b/multisrc/overrides/madara/mangapure/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangapure/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/mangapure/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..d0c5bd9549
Binary files /dev/null and b/multisrc/overrides/madara/mangapure/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangapure/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/mangapure/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..c70b55da99
Binary files /dev/null and b/multisrc/overrides/madara/mangapure/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangapure/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangapure/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..1c74979fb3
Binary files /dev/null and b/multisrc/overrides/madara/mangapure/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangapure/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangapure/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..d475ff12e4
Binary files /dev/null and b/multisrc/overrides/madara/mangapure/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangapure/res/web_hi_res_512.png b/multisrc/overrides/madara/mangapure/res/web_hi_res_512.png
new file mode 100644
index 0000000000..f8a8d7c118
Binary files /dev/null and b/multisrc/overrides/madara/mangapure/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/mangapure/src/MangaPure.kt b/multisrc/overrides/madara/mangapure/src/MangaPure.kt
new file mode 100644
index 0000000000..a918c44ea3
--- /dev/null
+++ b/multisrc/overrides/madara/mangapure/src/MangaPure.kt
@@ -0,0 +1,82 @@
+package eu.kanade.tachiyomi.extension.en.mangapure
+
+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.source.model.SManga
+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 MangaPure : Madara(
+ "MangaPure",
+ "https://mangapure.net",
+ "en",
+ dateFormat = SimpleDateFormat("MMM dd, HH:mm", Locale.ENGLISH),
+) {
+ override val useNewChapterEndpoint = false
+ override val mangaDetailsSelectorStatus = "div.summary-heading:contains(Status) + div.summary-content"
+
+ override fun searchMangaNextPageSelector(): String? = ".pagination a[rel=next]"
+
+ 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("Referer", "$baseUrl/")
+ .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,
+ )
+ }
+ }
+
+ // Some thumbnails expect harimanga.com, which has hotlink protection
+ override fun headersBuilder() = super.headersBuilder()
+ .removeAll("Referer")
+
+ // OnGoing => Ongoing
+ override fun mangaDetailsParse(document: Document): SManga {
+ return super.mangaDetailsParse(document).apply {
+ document.select(mangaDetailsSelectorStatus).lastOrNull()?.text()
+ .takeIf { it == "Ongoing" }
+ ?.let { status = SManga.ONGOING }
+ }
+ }
+}
diff --git a/multisrc/overrides/madara/mangaqueencom/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/mangaqueencom/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..1193cd3748
Binary files /dev/null and b/multisrc/overrides/madara/mangaqueencom/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangaqueencom/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/mangaqueencom/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..1aa7601976
Binary files /dev/null and b/multisrc/overrides/madara/mangaqueencom/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangaqueencom/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/mangaqueencom/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..416fb40ded
Binary files /dev/null and b/multisrc/overrides/madara/mangaqueencom/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangaqueencom/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangaqueencom/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..10a517b348
Binary files /dev/null and b/multisrc/overrides/madara/mangaqueencom/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangaqueencom/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangaqueencom/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..f35d211201
Binary files /dev/null and b/multisrc/overrides/madara/mangaqueencom/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangaqueencom/res/web_hi_res_512.png b/multisrc/overrides/madara/mangaqueencom/res/web_hi_res_512.png
new file mode 100644
index 0000000000..b888d7534c
Binary files /dev/null and b/multisrc/overrides/madara/mangaqueencom/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/mangaqueencom/src/MangaQueenCom.kt b/multisrc/overrides/madara/mangaqueencom/src/MangaQueenCom.kt
new file mode 100644
index 0000000000..ac7398fb7a
--- /dev/null
+++ b/multisrc/overrides/madara/mangaqueencom/src/MangaQueenCom.kt
@@ -0,0 +1,9 @@
+package eu.kanade.tachiyomi.extension.en.mangaqueencom
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+
+class MangaQueenCom : Madara("Manga Queen.com", "https://mangaqueen.com", "en") {
+ override val useNewChapterEndpoint = false
+
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
+}
diff --git a/multisrc/overrides/madara/mangaqueenonline/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/mangaqueenonline/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..25a5b1a38b
Binary files /dev/null and b/multisrc/overrides/madara/mangaqueenonline/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangaqueenonline/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/mangaqueenonline/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..dbe85bc46f
Binary files /dev/null and b/multisrc/overrides/madara/mangaqueenonline/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangaqueenonline/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/mangaqueenonline/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..164b647f92
Binary files /dev/null and b/multisrc/overrides/madara/mangaqueenonline/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangaqueenonline/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangaqueenonline/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..c8530f2148
Binary files /dev/null and b/multisrc/overrides/madara/mangaqueenonline/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangaqueenonline/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangaqueenonline/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..00c6e317e7
Binary files /dev/null and b/multisrc/overrides/madara/mangaqueenonline/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangaqueenonline/res/web_hi_res_512.png b/multisrc/overrides/madara/mangaqueenonline/res/web_hi_res_512.png
new file mode 100644
index 0000000000..ee69bd153a
Binary files /dev/null and b/multisrc/overrides/madara/mangaqueenonline/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/mangaqueenonline/src/MangaQueenOnline.kt b/multisrc/overrides/madara/mangaqueenonline/src/MangaQueenOnline.kt
new file mode 100644
index 0000000000..4539fcf35a
--- /dev/null
+++ b/multisrc/overrides/madara/mangaqueenonline/src/MangaQueenOnline.kt
@@ -0,0 +1,9 @@
+package eu.kanade.tachiyomi.extension.en.mangaqueenonline
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+
+class MangaQueenOnline : Madara("Manga Queen.online (unoriginal)", "https://mangaqueen.online", "en") {
+ override val useNewChapterEndpoint = false
+
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
+}
diff --git a/multisrc/overrides/madara/mangarawinfo/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/mangarawinfo/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..0d137e4505
Binary files /dev/null and b/multisrc/overrides/madara/mangarawinfo/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangarawinfo/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/mangarawinfo/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..8f581c07bb
Binary files /dev/null and b/multisrc/overrides/madara/mangarawinfo/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangarawinfo/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/mangarawinfo/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..b9850c6610
Binary files /dev/null and b/multisrc/overrides/madara/mangarawinfo/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangarawinfo/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangarawinfo/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..0caeae1f5f
Binary files /dev/null and b/multisrc/overrides/madara/mangarawinfo/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangarawinfo/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangarawinfo/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..351aeba936
Binary files /dev/null and b/multisrc/overrides/madara/mangarawinfo/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangarawinfo/res/web_hi_res_512.png b/multisrc/overrides/madara/mangarawinfo/res/web_hi_res_512.png
new file mode 100644
index 0000000000..a7b94c3771
Binary files /dev/null and b/multisrc/overrides/madara/mangarawinfo/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/mangarawinfo/src/MangaRawInfo.kt b/multisrc/overrides/madara/mangarawinfo/src/MangaRawInfo.kt
new file mode 100644
index 0000000000..aadc1a1bef
--- /dev/null
+++ b/multisrc/overrides/madara/mangarawinfo/src/MangaRawInfo.kt
@@ -0,0 +1,9 @@
+package eu.kanade.tachiyomi.extension.en.mangarawinfo
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+
+class MangaRawInfo : Madara("Manga-Raw.info (unoriginal)", "https://manga-raw.info", "en") {
+ override val useNewChapterEndpoint = false
+
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
+}
diff --git a/multisrc/overrides/madara/mangareadorg/src/MangaReadOrg.kt b/multisrc/overrides/madara/mangareadorg/src/MangaReadOrg.kt
index 090a26f3f1..2f9121aa3d 100644
--- a/multisrc/overrides/madara/mangareadorg/src/MangaReadOrg.kt
+++ b/multisrc/overrides/madara/mangareadorg/src/MangaReadOrg.kt
@@ -1,7 +1,23 @@
package eu.kanade.tachiyomi.extension.en.mangareadorg
import eu.kanade.tachiyomi.multisrc.madara.Madara
+import org.jsoup.nodes.Element
import java.text.SimpleDateFormat
import java.util.Locale
-class MangaReadOrg : Madara("MangaRead.org", "https://www.mangaread.org", "en", SimpleDateFormat("dd.MM.yyy", Locale.US))
+class MangaReadOrg : Madara(
+ "MangaRead.org",
+ "https://www.mangaread.org",
+ "en",
+ SimpleDateFormat("dd.MM.yyy", Locale.US),
+) {
+ override fun imageFromElement(element: Element): String? {
+ return when {
+ element.hasAttr("data-cfsrc") -> element.attr("abs:data-cfsrc")
+ element.hasAttr("data-src") -> element.attr("abs:data-src")
+ element.hasAttr("data-lazy-src") -> element.attr("abs:data-lazy-src")
+ element.hasAttr("srcset") -> element.attr("abs:srcset").substringBefore(" ")
+ else -> element.attr("abs:src")
+ }
+ }
+}
diff --git a/multisrc/overrides/madara/mangarockteamunoriginal/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/mangarockteamunoriginal/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..c4f9323374
Binary files /dev/null and b/multisrc/overrides/madara/mangarockteamunoriginal/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangarockteamunoriginal/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/mangarockteamunoriginal/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..9368d956eb
Binary files /dev/null and b/multisrc/overrides/madara/mangarockteamunoriginal/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangarockteamunoriginal/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/mangarockteamunoriginal/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..fc4dee1169
Binary files /dev/null and b/multisrc/overrides/madara/mangarockteamunoriginal/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangarockteamunoriginal/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangarockteamunoriginal/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..2ace1cc1bb
Binary files /dev/null and b/multisrc/overrides/madara/mangarockteamunoriginal/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangarockteamunoriginal/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangarockteamunoriginal/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..4826ab2e2c
Binary files /dev/null and b/multisrc/overrides/madara/mangarockteamunoriginal/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangarockteamunoriginal/res/web_hi_res_512.png b/multisrc/overrides/madara/mangarockteamunoriginal/res/web_hi_res_512.png
new file mode 100644
index 0000000000..86f271f4da
Binary files /dev/null and b/multisrc/overrides/madara/mangarockteamunoriginal/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/mangarockteamunoriginal/src/MangaRockTeamUnoriginal.kt b/multisrc/overrides/madara/mangarockteamunoriginal/src/MangaRockTeamUnoriginal.kt
new file mode 100644
index 0000000000..fe7d0fb266
--- /dev/null
+++ b/multisrc/overrides/madara/mangarockteamunoriginal/src/MangaRockTeamUnoriginal.kt
@@ -0,0 +1,9 @@
+package eu.kanade.tachiyomi.extension.en.mangarockteamunoriginal
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+
+class MangaRockTeamUnoriginal : Madara("Manga Rock.team (unoriginal)", "https://mangarock.team", "en") {
+ override val useNewChapterEndpoint = false
+
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
+}
diff --git a/multisrc/overrides/madara/mangarolls/src/MangaRolls.kt b/multisrc/overrides/madara/mangarolls/src/MangaRolls.kt
index 839740cbf7..59dd66ebb9 100644
--- a/multisrc/overrides/madara/mangarolls/src/MangaRolls.kt
+++ b/multisrc/overrides/madara/mangarolls/src/MangaRolls.kt
@@ -2,6 +2,6 @@ package eu.kanade.tachiyomi.extension.en.mangarolls
import eu.kanade.tachiyomi.multisrc.madara.Madara
-class MangaRolls : Madara("MangaRolls", "https://mangarolls.com", "en") {
+class MangaRolls : Madara("MangaRolls", "https://mangarolls.net", "en") {
override val useNewChapterEndpoint = true
}
diff --git a/multisrc/overrides/madara/mangarose/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/mangarose/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..445a0c9299
Binary files /dev/null and b/multisrc/overrides/madara/mangarose/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangarose/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/mangarose/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..dae395afbf
Binary files /dev/null and b/multisrc/overrides/madara/mangarose/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangarose/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/mangarose/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..75d7f70dc0
Binary files /dev/null and b/multisrc/overrides/madara/mangarose/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangarose/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangarose/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..b81f439a7a
Binary files /dev/null and b/multisrc/overrides/madara/mangarose/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangarose/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangarose/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..4918ad3213
Binary files /dev/null and b/multisrc/overrides/madara/mangarose/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangarose/res/web_hi_res_512.png b/multisrc/overrides/madara/mangarose/res/web_hi_res_512.png
new file mode 100644
index 0000000000..4aba204501
Binary files /dev/null and b/multisrc/overrides/madara/mangarose/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/mangarose/src/MangaRose.kt b/multisrc/overrides/madara/mangarose/src/MangaRose.kt
new file mode 100644
index 0000000000..f6a9884707
--- /dev/null
+++ b/multisrc/overrides/madara/mangarose/src/MangaRose.kt
@@ -0,0 +1,20 @@
+package eu.kanade.tachiyomi.extension.ar.mangarose
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+import java.text.SimpleDateFormat
+import java.util.Locale
+
+class MangaRose : Madara(
+ "Manga Rose",
+ "https://mangarose.net",
+ "ar",
+ dateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale("ar")),
+) {
+ override fun searchPage(page: Int): String {
+ return if (page > 1) {
+ "page/$page/"
+ } else {
+ ""
+ }
+ }
+}
diff --git a/multisrc/overrides/madara/mangarosie/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/mangarosie/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..df35ab65d1
Binary files /dev/null and b/multisrc/overrides/madara/mangarosie/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangarosie/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/mangarosie/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..14aa21896e
Binary files /dev/null and b/multisrc/overrides/madara/mangarosie/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangarosie/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/mangarosie/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..b343dd43dd
Binary files /dev/null and b/multisrc/overrides/madara/mangarosie/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangarosie/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangarosie/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..bb0770db70
Binary files /dev/null and b/multisrc/overrides/madara/mangarosie/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangarosie/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangarosie/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..1703be00ea
Binary files /dev/null and b/multisrc/overrides/madara/mangarosie/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangarosie/res/web_hi_res_512.png b/multisrc/overrides/madara/mangarosie/res/web_hi_res_512.png
new file mode 100644
index 0000000000..bad73d3e3c
Binary files /dev/null and b/multisrc/overrides/madara/mangarosie/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/mangarosie/src/MangaRosie.kt b/multisrc/overrides/madara/mangarosie/src/MangaRosie.kt
new file mode 100644
index 0000000000..08b563be91
--- /dev/null
+++ b/multisrc/overrides/madara/mangarosie/src/MangaRosie.kt
@@ -0,0 +1,10 @@
+package eu.kanade.tachiyomi.extension.en.mangarosie
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+
+class MangaRosie : Madara("MangaRosie", "https://mangarosie.in", "en") {
+ override val useNewChapterEndpoint = 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/mangarubycom/src/MangaRubyCom.kt b/multisrc/overrides/madara/mangarubycom/src/MangaRubyCom.kt
new file mode 100644
index 0000000000..c75ef93363
--- /dev/null
+++ b/multisrc/overrides/madara/mangarubycom/src/MangaRubyCom.kt
@@ -0,0 +1,10 @@
+package eu.kanade.tachiyomi.extension.en.mangarubycom
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+
+class MangaRubyCom : Madara("MangaRuby.com", "https://mangaruby.com", "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/mangaryu/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/mangaryu/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..66b742d5aa
Binary files /dev/null and b/multisrc/overrides/madara/mangaryu/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangaryu/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/mangaryu/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..6c0b1d49cc
Binary files /dev/null and b/multisrc/overrides/madara/mangaryu/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangaryu/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/mangaryu/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..57c8aa6a1a
Binary files /dev/null and b/multisrc/overrides/madara/mangaryu/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangaryu/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangaryu/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..e84d14bea2
Binary files /dev/null and b/multisrc/overrides/madara/mangaryu/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangaryu/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangaryu/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..b154a8a74b
Binary files /dev/null and b/multisrc/overrides/madara/mangaryu/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangaryu/res/web_hi_res_512.png b/multisrc/overrides/madara/mangaryu/res/web_hi_res_512.png
new file mode 100644
index 0000000000..552c952df3
Binary files /dev/null and b/multisrc/overrides/madara/mangaryu/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/mangaryu/src/Mangaryu.kt b/multisrc/overrides/madara/mangaryu/src/Mangaryu.kt
new file mode 100644
index 0000000000..616998644c
--- /dev/null
+++ b/multisrc/overrides/madara/mangaryu/src/Mangaryu.kt
@@ -0,0 +1,9 @@
+package eu.kanade.tachiyomi.extension.en.mangaryu
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+
+class Mangaryu : Madara("Mangaryu", "https://mangaryu.com", "en") {
+ override val useNewChapterEndpoint = false
+
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
+}
diff --git a/multisrc/overrides/madara/mangasehri/src/MangaSehri.kt b/multisrc/overrides/madara/mangasehri/src/MangaSehri.kt
index 94d9507c48..e5d8ffde7f 100644
--- a/multisrc/overrides/madara/mangasehri/src/MangaSehri.kt
+++ b/multisrc/overrides/madara/mangasehri/src/MangaSehri.kt
@@ -6,9 +6,11 @@ import java.util.Locale
class MangaSehri : Madara(
"Manga Şehri",
- "https://mangasehri.com",
+ "https://manga-sehri.com",
"tr",
SimpleDateFormat("dd/MM/yyy", Locale("tr")),
) {
- override val useNewChapterEndpoint = true
+ override val useNewChapterEndpoint = false
+
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
}
diff --git a/multisrc/overrides/zeistmanga/muslosnosekai/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/mangasnosekai/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/zeistmanga/muslosnosekai/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/madara/mangasnosekai/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/zeistmanga/muslosnosekai/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/mangasnosekai/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/zeistmanga/muslosnosekai/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/madara/mangasnosekai/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/zeistmanga/muslosnosekai/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/mangasnosekai/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/zeistmanga/muslosnosekai/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/madara/mangasnosekai/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/zeistmanga/muslosnosekai/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangasnosekai/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/zeistmanga/muslosnosekai/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/madara/mangasnosekai/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/zeistmanga/muslosnosekai/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangasnosekai/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/zeistmanga/muslosnosekai/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/madara/mangasnosekai/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/zeistmanga/muslosnosekai/res/web_hi_res_512.png b/multisrc/overrides/madara/mangasnosekai/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/zeistmanga/muslosnosekai/res/web_hi_res_512.png
rename to multisrc/overrides/madara/mangasnosekai/res/web_hi_res_512.png
diff --git a/multisrc/overrides/madara/mangasnosekai/src/MangasNoSekai.kt b/multisrc/overrides/madara/mangasnosekai/src/MangasNoSekai.kt
new file mode 100644
index 0000000000..0a84b89336
--- /dev/null
+++ b/multisrc/overrides/madara/mangasnosekai/src/MangasNoSekai.kt
@@ -0,0 +1,115 @@
+package eu.kanade.tachiyomi.extension.es.mangasnosekai
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+import eu.kanade.tachiyomi.network.GET
+import eu.kanade.tachiyomi.network.interceptor.rateLimitHost
+import eu.kanade.tachiyomi.source.model.SManga
+import okhttp3.HttpUrl.Companion.toHttpUrl
+import okhttp3.Request
+import org.jsoup.nodes.Document
+import org.jsoup.nodes.Element
+import java.text.SimpleDateFormat
+import java.util.Locale
+
+class MangasNoSekai : Madara(
+ "Mangas No Sekai",
+ "https://mangasnosekai.com",
+ "es",
+ SimpleDateFormat("MMMM dd, yyyy", Locale("es")),
+) {
+ override val client = super.client.newBuilder()
+ .rateLimitHost(baseUrl.toHttpUrl(), 2, 1)
+ .build()
+
+ override val useNewChapterEndpoint = true
+
+ override fun popularMangaRequest(page: Int): Request = GET("$baseUrl/${searchPage(page)}?s=&post_type=wp-manga&m_orderby=views", headers)
+
+ override fun popularMangaSelector() = searchMangaSelector()
+
+ override fun popularMangaFromElement(element: Element) = searchMangaFromElement(element)
+
+ override fun latestUpdatesRequest(page: Int): Request = GET("$baseUrl/${searchPage(page)}?s=&post_type=wp-manga&m_orderby=latest", headers)
+
+ override fun latestUpdatesSelector() = searchMangaSelector()
+
+ override fun latestUpdatesFromElement(element: Element) = searchMangaFromElement(element)
+
+ override fun searchPage(page: Int): String {
+ return if (page > 1) "page/$page/" else ""
+ }
+
+ override fun searchMangaNextPageSelector() = "nav.navigation a.next"
+
+ override val mangaDetailsSelectorTitle = "div.summary-content h1.titleManga"
+ override val mangaDetailsSelectorThumbnail = "div.tab-summary img.img-responsive"
+ override val mangaDetailsSelectorDescription = "div.summary-content div.artist-content"
+ override val mangaDetailsSelectorStatus = "div.summary-content ul.general-List li:has(span:contains(Estado))"
+ override val mangaDetailsSelectorAuthor = "div.summary-content ul.general-List li:has(span:contains(Autor))"
+ override val mangaDetailsSelectorArtist = "div.summary-content ul.general-List li:has(span:contains(Dibujante))"
+ override val seriesTypeSelector = "div.summary-content ul.general-List li:has(span:contains(Tipo))"
+
+ override fun mangaDetailsParse(document: Document): SManga {
+ val manga = SManga.create()
+ with(document) {
+ selectFirst(mangaDetailsSelectorTitle)?.let {
+ manga.title = it.ownText()
+ }
+ selectFirst(mangaDetailsSelectorAuthor)?.ownText()?.let {
+ manga.author = it
+ }
+ selectFirst(mangaDetailsSelectorArtist)?.ownText()?.let {
+ manga.artist = it
+ }
+ select(mangaDetailsSelectorDescription).let {
+ manga.description = it.text()
+ }
+ select(mangaDetailsSelectorThumbnail).first()?.let {
+ manga.thumbnail_url = imageFromElement(it)
+ }
+ selectFirst(mangaDetailsSelectorStatus)?.ownText()?.let {
+ manga.status = when (it) {
+ in completedStatusList -> SManga.COMPLETED
+ in ongoingStatusList -> SManga.ONGOING
+ in hiatusStatusList -> SManga.ON_HIATUS
+ in canceledStatusList -> SManga.CANCELLED
+ else -> SManga.UNKNOWN
+ }
+ }
+ val genres = select(mangaDetailsSelectorGenre)
+ .map { element -> element.text().lowercase(Locale.ROOT) }
+ .toMutableSet()
+
+ // add manga/manhwa/manhua thinggy to genre
+ document.select(seriesTypeSelector).firstOrNull()?.ownText()?.let {
+ if (it.isEmpty().not() && it.notUpdating() && it != "-" && genres.contains(it).not()) {
+ genres.add(it.lowercase(Locale.ROOT))
+ }
+ }
+
+ manga.genre = genres.toList().joinToString(", ") { genre ->
+ genre.replaceFirstChar {
+ if (it.isLowerCase()) {
+ it.titlecase(
+ Locale.ROOT,
+ )
+ } else {
+ it.toString()
+ }
+ }
+ }
+
+ // add alternative name to manga description
+ document.select(altNameSelector).firstOrNull()?.ownText()?.let {
+ if (it.isBlank().not() && it.notUpdating()) {
+ manga.description = when {
+ manga.description.isNullOrBlank() -> altName + it
+ else -> manga.description + "\n\n$altName" + it
+ }
+ }
+ }
+ }
+
+ return manga
+ }
+}
diff --git a/multisrc/overrides/madara/mangasoriginesfr/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/mangasoriginesfr/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..19e312104e
Binary files /dev/null and b/multisrc/overrides/madara/mangasoriginesfr/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangasoriginesfr/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/mangasoriginesfr/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..ab64511ba5
Binary files /dev/null and b/multisrc/overrides/madara/mangasoriginesfr/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangasoriginesfr/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/mangasoriginesfr/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..701f0bf67c
Binary files /dev/null and b/multisrc/overrides/madara/mangasoriginesfr/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangasoriginesfr/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangasoriginesfr/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..b0e8a2baf9
Binary files /dev/null and b/multisrc/overrides/madara/mangasoriginesfr/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangasoriginesfr/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangasoriginesfr/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..03f4db8613
Binary files /dev/null and b/multisrc/overrides/madara/mangasoriginesfr/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangasoriginesfr/res/web_hi_res_512.png b/multisrc/overrides/madara/mangasoriginesfr/res/web_hi_res_512.png
new file mode 100644
index 0000000000..f465790acb
Binary files /dev/null and b/multisrc/overrides/madara/mangasoriginesfr/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/mangasoriginesfr/src/MangasOriginesFr.kt b/multisrc/overrides/madara/mangasoriginesfr/src/MangasOriginesFr.kt
new file mode 100644
index 0000000000..2af4ddc5dd
--- /dev/null
+++ b/multisrc/overrides/madara/mangasoriginesfr/src/MangasOriginesFr.kt
@@ -0,0 +1,13 @@
+package eu.kanade.tachiyomi.extension.fr.mangasoriginesfr
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+import java.text.SimpleDateFormat
+import java.util.Locale
+
+class MangasOriginesFr : Madara("Mangas-Origines.fr", "https://mangas-origines.fr", "fr", SimpleDateFormat("dd/mm/yyyy", Locale("fr"))) {
+ override val mangaSubString = "catalogues"
+
+ // Manga Details Selectors
+ override val mangaDetailsSelectorAuthor = "div.manga-authors > a"
+ override val mangaDetailsSelectorDescription = "div.summary__content > p"
+}
diff --git a/multisrc/overrides/madara/mangasoriginesx/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/mangasoriginesx/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index 081e9f6bf3..0000000000
Binary files a/multisrc/overrides/madara/mangasoriginesx/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/mangasoriginesx/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/mangasoriginesx/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index 2cabf7f70d..0000000000
Binary files a/multisrc/overrides/madara/mangasoriginesx/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/mangasoriginesx/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/mangasoriginesx/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 58b14a5f53..0000000000
Binary files a/multisrc/overrides/madara/mangasoriginesx/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/mangasoriginesx/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangasoriginesx/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index a1e16eafae..0000000000
Binary files a/multisrc/overrides/madara/mangasoriginesx/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/mangasoriginesx/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangasoriginesx/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index ba31465175..0000000000
Binary files a/multisrc/overrides/madara/mangasoriginesx/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/mangasoriginesx/res/web_hi_res_512.png b/multisrc/overrides/madara/mangasoriginesx/res/web_hi_res_512.png
deleted file mode 100644
index 87dbfb91ce..0000000000
Binary files a/multisrc/overrides/madara/mangasoriginesx/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/madara/mangasoriginesx/src/MangasOriginesX.kt b/multisrc/overrides/madara/mangasoriginesx/src/MangasOriginesX.kt
deleted file mode 100644
index 56e3bcce24..0000000000
--- a/multisrc/overrides/madara/mangasoriginesx/src/MangasOriginesX.kt
+++ /dev/null
@@ -1,7 +0,0 @@
-package eu.kanade.tachiyomi.extension.fr.mangasoriginesx
-
-import eu.kanade.tachiyomi.multisrc.madara.Madara
-import java.text.SimpleDateFormat
-import java.util.Locale
-
-class MangasOriginesX : Madara("Mangas Origines X", "https://x.mangas-origines.fr", "fr", SimpleDateFormat("dd/MM/yyyy", Locale("fr")))
diff --git a/multisrc/overrides/madara/mangaspark/src/MangaSpark.kt b/multisrc/overrides/madara/mangaspark/src/MangaSpark.kt
index d82e09e9d8..e35aaa4b00 100644
--- a/multisrc/overrides/madara/mangaspark/src/MangaSpark.kt
+++ b/multisrc/overrides/madara/mangaspark/src/MangaSpark.kt
@@ -1,26 +1,18 @@
package eu.kanade.tachiyomi.extension.ar.mangaspark
import eu.kanade.tachiyomi.multisrc.madara.Madara
-import eu.kanade.tachiyomi.source.model.SManga
-import org.jsoup.nodes.Element
+import java.text.SimpleDateFormat
+import java.util.Locale
-class MangaSpark : Madara("MangaSpark", "https://mangaspark.com", "ar") {
- override fun popularMangaFromElement(element: Element): SManga {
- val manga = SManga.create()
-
- with(element) {
- select(popularMangaUrlSelector).first()?.let {
- manga.setUrlWithoutDomain(it.attr("abs:href"))
- manga.title = it.ownText()
- }
-
- select("img").first()?.let {
- manga.thumbnail_url = imageFromElement(it)?.replace("mangaspark", "mangalek")
- }
- }
+class MangaSpark : Madara(
+ "MangaSpark",
+ "https://mangaspark.org",
+ "ar",
+ dateFormat = SimpleDateFormat("d MMMM، yyyy", Locale("ar")),
+) {
+ override val chapterUrlSuffix = ""
- return manga
- }
+ override val useNewChapterEndpoint = false
- override val chapterUrlSuffix = ""
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
}
diff --git a/multisrc/overrides/madara/mangastarz/src/MangaStarz.kt b/multisrc/overrides/madara/mangastarz/src/MangaStarz.kt
index 330b4c595e..4001e58885 100644
--- a/multisrc/overrides/madara/mangastarz/src/MangaStarz.kt
+++ b/multisrc/overrides/madara/mangastarz/src/MangaStarz.kt
@@ -1,31 +1,18 @@
package eu.kanade.tachiyomi.extension.ar.mangastarz
import eu.kanade.tachiyomi.multisrc.madara.Madara
-import eu.kanade.tachiyomi.source.model.SManga
-import okhttp3.Headers
-import org.jsoup.nodes.Element
-
-class MangaStarz : Madara("Manga Starz", "https://mangastarz.com", "ar") {
-
- override fun headersBuilder(): Headers.Builder = Headers.Builder()
- .add("Referer", baseUrl)
-
- override fun popularMangaFromElement(element: Element): SManga {
- val manga = SManga.create()
-
- with(element) {
- select(popularMangaUrlSelector).first()?.let {
- manga.setUrlWithoutDomain(it.attr("abs:href"))
- manga.title = it.ownText()
- }
-
- select("img").first()?.let {
- manga.thumbnail_url = imageFromElement(it)?.replace("mangastarz", "mangalek")
- }
- }
+import java.text.SimpleDateFormat
+import java.util.Locale
+
+class MangaStarz : Madara(
+ "Manga Starz",
+ "https://mangastarz.org",
+ "ar",
+ dateFormat = SimpleDateFormat("d MMMM، yyyy", Locale("ar")),
+) {
+ override val chapterUrlSuffix = ""
- return manga
- }
+ override val useNewChapterEndpoint = false
- override val chapterUrlSuffix = ""
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
}
diff --git a/multisrc/overrides/madara/mangastk18/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/mangastk18/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index af02e5668c..0000000000
Binary files a/multisrc/overrides/madara/mangastk18/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/mangastk18/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/mangastk18/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index 3145bc9a93..0000000000
Binary files a/multisrc/overrides/madara/mangastk18/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/mangastk18/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/mangastk18/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 81f7927557..0000000000
Binary files a/multisrc/overrides/madara/mangastk18/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/mangastk18/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangastk18/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 7304c324d5..0000000000
Binary files a/multisrc/overrides/madara/mangastk18/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/mangastk18/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangastk18/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index e818270b6a..0000000000
Binary files a/multisrc/overrides/madara/mangastk18/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/mangastk18/res/web_hi_res_512.png b/multisrc/overrides/madara/mangastk18/res/web_hi_res_512.png
deleted file mode 100644
index 2393ecee06..0000000000
Binary files a/multisrc/overrides/madara/mangastk18/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/madara/mangastk18/src/MangasTK18.kt b/multisrc/overrides/madara/mangastk18/src/MangasTK18.kt
deleted file mode 100644
index 66f0f95437..0000000000
--- a/multisrc/overrides/madara/mangastk18/src/MangasTK18.kt
+++ /dev/null
@@ -1,54 +0,0 @@
-package eu.kanade.tachiyomi.extension.es.mangastk18
-
-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
-
-class MangasTK18 : Madara(
- "MangasTK18",
- "https://mangastk18.com",
- "es",
- SimpleDateFormat("dd.MM.yyyy", Locale("es")),
-) {
- override fun popularMangaSelector() = "div#series-card:has(a:not([href*='bilibilicomics.com']))"
- override val popularMangaUrlSelector = "a.series-link"
-
- override val mangaDetailsSelectorTag = "div.tags-content a.notUsed" // Source use this for the scanlator
- override val mangaDetailsSelectorStatus = "div.post-status div.summary-content"
-
- override fun popularMangaFromElement(element: Element): SManga {
- val manga = SManga.create()
-
- with(element) {
- select(popularMangaUrlSelector).first()?.let {
- manga.setUrlWithoutDomain(it.attr("abs:href"))
- manga.title = it.attr("title")
- }
-
- select("img").first()?.let {
- manga.thumbnail_url = imageFromElement(it)
- }
- }
-
- return manga
- }
-
- override fun chapterFromElement(element: Element): SChapter {
- val chapter = SChapter.create()
-
- with(element) {
- select(chapterUrlSelector).first()?.let { urlElement ->
- chapter.url = urlElement.attr("abs:href").let {
- it.substringBefore("?style=paged") + if (!it.endsWith(chapterUrlSuffix)) chapterUrlSuffix else ""
- }
- chapter.name = urlElement.select("p.chapter-manhwa-title").text()
- chapter.date_upload = parseChapterDate(select("span.chapter-release-date").text())
- }
- }
-
- return chapter
- }
-}
diff --git a/multisrc/overrides/madara/mangatopsite/src/MangaTopSite.kt b/multisrc/overrides/madara/mangatopsite/src/MangaTopSite.kt
new file mode 100644
index 0000000000..5a82c94afd
--- /dev/null
+++ b/multisrc/overrides/madara/mangatopsite/src/MangaTopSite.kt
@@ -0,0 +1,17 @@
+package eu.kanade.tachiyomi.extension.all.mangatopsite
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+import java.text.SimpleDateFormat
+import java.util.Locale
+
+class MangaTopSite : Madara(
+ "MangaTop.site",
+ "https://mangatop.site",
+ "all",
+ dateFormat = SimpleDateFormat("d MMM yyyy", Locale.ENGLISH),
+) {
+ override val useNewChapterEndpoint = false
+ override val chapterUrlSuffix = ""
+
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
+}
diff --git a/multisrc/overrides/madara/mangatxgg/src/MangaTxGg.kt b/multisrc/overrides/madara/mangatxgg/src/MangaTxGg.kt
new file mode 100644
index 0000000000..2a3fc88267
--- /dev/null
+++ b/multisrc/overrides/madara/mangatxgg/src/MangaTxGg.kt
@@ -0,0 +1,9 @@
+package eu.kanade.tachiyomi.extension.en.mangatxgg
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+
+class MangaTxGg : Madara("Manga Tx.gg (unoriginal)", "https://mangatx.gg", "en") {
+ override val useNewChapterEndpoint = false
+
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
+}
diff --git a/multisrc/overrides/madara/mangatyrant/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/mangatyrant/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..74743325ee
Binary files /dev/null and b/multisrc/overrides/madara/mangatyrant/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangatyrant/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/mangatyrant/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..328d8b00a0
Binary files /dev/null and b/multisrc/overrides/madara/mangatyrant/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangatyrant/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/mangatyrant/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..a9f6a61a2c
Binary files /dev/null and b/multisrc/overrides/madara/mangatyrant/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangatyrant/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangatyrant/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..6f5b31b4e3
Binary files /dev/null and b/multisrc/overrides/madara/mangatyrant/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangatyrant/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangatyrant/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..af9506f012
Binary files /dev/null and b/multisrc/overrides/madara/mangatyrant/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangatyrant/res/web_hi_res_512.png b/multisrc/overrides/madara/mangatyrant/res/web_hi_res_512.png
new file mode 100644
index 0000000000..be48a766b7
Binary files /dev/null and b/multisrc/overrides/madara/mangatyrant/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/mangatyrant/src/MangaTyrant.kt b/multisrc/overrides/madara/mangatyrant/src/MangaTyrant.kt
new file mode 100644
index 0000000000..88557eba36
--- /dev/null
+++ b/multisrc/overrides/madara/mangatyrant/src/MangaTyrant.kt
@@ -0,0 +1,10 @@
+package eu.kanade.tachiyomi.extension.en.mangatyrant
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+
+class MangaTyrant : Madara("MangaTyrant", "https://mangatyrant.com", "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/mangaupdatestop/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/mangaupdatestop/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..d8bbacd490
Binary files /dev/null and b/multisrc/overrides/madara/mangaupdatestop/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangaupdatestop/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/mangaupdatestop/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..ec35ead1d0
Binary files /dev/null and b/multisrc/overrides/madara/mangaupdatestop/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangaupdatestop/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/mangaupdatestop/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..bd959ac04d
Binary files /dev/null and b/multisrc/overrides/madara/mangaupdatestop/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangaupdatestop/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangaupdatestop/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..58989ca02b
Binary files /dev/null and b/multisrc/overrides/madara/mangaupdatestop/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangaupdatestop/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangaupdatestop/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..3ae51ec0a2
Binary files /dev/null and b/multisrc/overrides/madara/mangaupdatestop/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangaupdatestop/res/web_hi_res_512.png b/multisrc/overrides/madara/mangaupdatestop/res/web_hi_res_512.png
new file mode 100644
index 0000000000..a624bd17dd
Binary files /dev/null and b/multisrc/overrides/madara/mangaupdatestop/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/mangaupdatestop/src/MangaUpdatesTop.kt b/multisrc/overrides/madara/mangaupdatestop/src/MangaUpdatesTop.kt
new file mode 100644
index 0000000000..e8319f8289
--- /dev/null
+++ b/multisrc/overrides/madara/mangaupdatestop/src/MangaUpdatesTop.kt
@@ -0,0 +1,9 @@
+package eu.kanade.tachiyomi.extension.en.mangaupdatestop
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+
+class MangaUpdatesTop : Madara("MangaUpdates.top (unoriginal)", "https://mangaupdates.top", "en") {
+ override val useNewChapterEndpoint = false
+
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
+}
diff --git a/multisrc/overrides/madara/mangauptocats/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/mangauptocats/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index 5fd175692a..0000000000
Binary files a/multisrc/overrides/madara/mangauptocats/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/mangauptocats/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/mangauptocats/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index a7e267d4e1..0000000000
Binary files a/multisrc/overrides/madara/mangauptocats/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/mangauptocats/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/mangauptocats/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 739cf5a64d..0000000000
Binary files a/multisrc/overrides/madara/mangauptocats/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/mangauptocats/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangauptocats/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 0122839a85..0000000000
Binary files a/multisrc/overrides/madara/mangauptocats/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/mangauptocats/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangauptocats/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 1a6c8451cf..0000000000
Binary files a/multisrc/overrides/madara/mangauptocats/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/mangauptocats/res/web_hi_res_512.png b/multisrc/overrides/madara/mangauptocats/res/web_hi_res_512.png
deleted file mode 100644
index c92436b6f1..0000000000
Binary files a/multisrc/overrides/madara/mangauptocats/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/madara/mangauptocats/src/Mangauptocats.kt b/multisrc/overrides/madara/mangauptocats/src/Mangauptocats.kt
deleted file mode 100644
index 2d52653831..0000000000
--- a/multisrc/overrides/madara/mangauptocats/src/Mangauptocats.kt
+++ /dev/null
@@ -1,12 +0,0 @@
-package eu.kanade.tachiyomi.extension.th.mangauptocats
-
-import eu.kanade.tachiyomi.multisrc.madara.Madara
-import java.text.SimpleDateFormat
-import java.util.Locale
-
-class Mangauptocats : Madara(
- "Mangauptocats",
- "https://manga-uptocats.com",
- "th",
- SimpleDateFormat("d MMMM yyyy", Locale("th")),
-)
diff --git a/multisrc/overrides/madara/mangaweebs/src/MangaWeebs.kt b/multisrc/overrides/madara/mangaweebs/src/MangaWeebs.kt
index 2ae07b0488..c49ee8620f 100644
--- a/multisrc/overrides/madara/mangaweebs/src/MangaWeebs.kt
+++ b/multisrc/overrides/madara/mangaweebs/src/MangaWeebs.kt
@@ -1,12 +1,19 @@
package eu.kanade.tachiyomi.extension.en.mangaweebs
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 MangaWeebs : Madara("Manga Weebs", "https://mangaweebs.in", "en", dateFormat = SimpleDateFormat("dd MMMM HH:mm", Locale.US)) {
+ override val client: OkHttpClient = super.client.newBuilder()
+ .rateLimit(20, 4, TimeUnit.SECONDS)
+ .build()
+
override val mangaDetailsSelectorTag = ""
- override val pageListParseSelector = "div.page-break > div.loading, li.blocks-gallery-item, .reading-content .text-left:not(:has(.blocks-gallery-item)) :has(>img)"
+ override val pageListParseSelector = ".reading-content img:not([src*=\"logo.png\"])"
}
diff --git a/multisrc/overrides/madara/mangaxico/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/mangaxico/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..e50310ff03
Binary files /dev/null and b/multisrc/overrides/madara/mangaxico/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangaxico/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/mangaxico/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..230aca423f
Binary files /dev/null and b/multisrc/overrides/madara/mangaxico/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangaxico/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/mangaxico/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..ad00c69c0b
Binary files /dev/null and b/multisrc/overrides/madara/mangaxico/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangaxico/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangaxico/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..1e6bb92108
Binary files /dev/null and b/multisrc/overrides/madara/mangaxico/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangaxico/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/mangaxico/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..6241658923
Binary files /dev/null and b/multisrc/overrides/madara/mangaxico/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mangaxico/res/web_hi_res_512.png b/multisrc/overrides/madara/mangaxico/res/web_hi_res_512.png
new file mode 100644
index 0000000000..01a54a032a
Binary files /dev/null and b/multisrc/overrides/madara/mangaxico/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/mangaxico/src/Mangaxico.kt b/multisrc/overrides/madara/mangaxico/src/Mangaxico.kt
new file mode 100644
index 0000000000..5b55efb1e7
--- /dev/null
+++ b/multisrc/overrides/madara/mangaxico/src/Mangaxico.kt
@@ -0,0 +1,15 @@
+package eu.kanade.tachiyomi.extension.es.mangaxico
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+import java.text.SimpleDateFormat
+import java.util.Locale
+
+class Mangaxico : Madara(
+ "Mangaxico",
+ "https://mangaxico.com",
+ "es",
+ SimpleDateFormat("MMMM dd, yyyy", Locale("es")),
+) {
+ override val useNewChapterEndpoint = true
+ override val chapterUrlSuffix = ""
+}
diff --git a/multisrc/overrides/madara/manhastro/src/Manhastro.kt b/multisrc/overrides/madara/manhastro/src/Manhastro.kt
new file mode 100644
index 0000000000..95f23a6964
--- /dev/null
+++ b/multisrc/overrides/madara/manhastro/src/Manhastro.kt
@@ -0,0 +1,22 @@
+package eu.kanade.tachiyomi.extension.pt.manhastro
+
+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 Manhastro : Madara(
+ "Manhastro",
+ "https://manhastro.com",
+ "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/manhuadex/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/manhuadex/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..e7fae49725
Binary files /dev/null and b/multisrc/overrides/madara/manhuadex/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/manhuadex/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/manhuadex/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..fbf331407c
Binary files /dev/null and b/multisrc/overrides/madara/manhuadex/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/manhuadex/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/manhuadex/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..98fdb1ddd7
Binary files /dev/null and b/multisrc/overrides/madara/manhuadex/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/manhuadex/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/manhuadex/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..21f4f29efd
Binary files /dev/null and b/multisrc/overrides/madara/manhuadex/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/manhuadex/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/manhuadex/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..44116a142d
Binary files /dev/null and b/multisrc/overrides/madara/manhuadex/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/manhuadex/res/web_hi_res_512.png b/multisrc/overrides/madara/manhuadex/res/web_hi_res_512.png
new file mode 100644
index 0000000000..2bcad01a44
Binary files /dev/null and b/multisrc/overrides/madara/manhuadex/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/manhuadex/src/ManhuaDex.kt b/multisrc/overrides/madara/manhuadex/src/ManhuaDex.kt
new file mode 100644
index 0000000000..38509251f6
--- /dev/null
+++ b/multisrc/overrides/madara/manhuadex/src/ManhuaDex.kt
@@ -0,0 +1,9 @@
+package eu.kanade.tachiyomi.extension.en.manhuadex
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+
+class ManhuaDex : Madara("ManhuaDex", "https://manhuadex.com", "en") {
+ override val useNewChapterEndpoint = true
+
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
+}
diff --git a/multisrc/overrides/madara/manhuadragon/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/manhuadragon/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index 27c3b84ffd..0000000000
Binary files a/multisrc/overrides/madara/manhuadragon/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/manhuadragon/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/manhuadragon/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index e82ffd2b58..0000000000
Binary files a/multisrc/overrides/madara/manhuadragon/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/manhuadragon/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/manhuadragon/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 394adcee29..0000000000
Binary files a/multisrc/overrides/madara/manhuadragon/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/manhuadragon/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/manhuadragon/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 482e788b94..0000000000
Binary files a/multisrc/overrides/madara/manhuadragon/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/manhuadragon/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/manhuadragon/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 501b8ce1ac..0000000000
Binary files a/multisrc/overrides/madara/manhuadragon/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/manhuadragon/res/web_hi_res_512.png b/multisrc/overrides/madara/manhuadragon/res/web_hi_res_512.png
deleted file mode 100644
index 693b3e14b9..0000000000
Binary files a/multisrc/overrides/madara/manhuadragon/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/madara/manhuafast/src/ManhuaFast.kt b/multisrc/overrides/madara/manhuafast/src/ManhuaFast.kt
index 3550ef28b8..cfac96d24a 100644
--- a/multisrc/overrides/madara/manhuafast/src/ManhuaFast.kt
+++ b/multisrc/overrides/madara/manhuafast/src/ManhuaFast.kt
@@ -1,9 +1,37 @@
package eu.kanade.tachiyomi.extension.en.manhuafast
import eu.kanade.tachiyomi.multisrc.madara.Madara
+import eu.kanade.tachiyomi.network.GET
+import eu.kanade.tachiyomi.network.interceptor.rateLimit
+import okhttp3.CacheControl
+import okhttp3.OkHttpClient
+import okhttp3.Request
+import java.util.concurrent.TimeUnit
class ManhuaFast : Madara("ManhuaFast", "https://manhuafast.com", "en") {
+ override val client: OkHttpClient = super.client.newBuilder()
+ .rateLimit(20, 4, TimeUnit.SECONDS)
+ .build()
+
// The website does not flag the content.
override val filterNonMangaItems = false
+
+ override fun popularMangaRequest(page: Int): Request {
+ return GET(
+ url = "$baseUrl/${searchPage(page)}?s&post_type=wp-manga&m_orderby=views",
+ headers = headers,
+ cache = CacheControl.FORCE_NETWORK,
+ )
+ }
+
+ override fun popularMangaSelector() = searchMangaSelector()
+
+ override fun latestUpdatesRequest(page: Int): Request {
+ return GET(
+ url = "$baseUrl/${searchPage(page)}?s&post_type=wp-manga&m_orderby=latest",
+ headers = headers,
+ cache = CacheControl.FORCE_NETWORK,
+ )
+ }
}
diff --git a/multisrc/overrides/madara/manhuafastnet/src/ManhuaFastNet.kt b/multisrc/overrides/madara/manhuafastnet/src/ManhuaFastNet.kt
new file mode 100644
index 0000000000..cca61bb0c4
--- /dev/null
+++ b/multisrc/overrides/madara/manhuafastnet/src/ManhuaFastNet.kt
@@ -0,0 +1,9 @@
+package eu.kanade.tachiyomi.extension.en.manhuafastnet
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+
+class ManhuaFastNet : Madara("ManhuaFast.net (unoriginal)", "https://manhuafast.net", "en") {
+ override val useNewChapterEndpoint = true
+
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
+}
diff --git a/multisrc/overrides/madara/manhuaga/src/Manhuaga.kt b/multisrc/overrides/madara/manhuaga/src/Manhuaga.kt
index f10b60c7eb..9e8ddf99db 100644
--- a/multisrc/overrides/madara/manhuaga/src/Manhuaga.kt
+++ b/multisrc/overrides/madara/manhuaga/src/Manhuaga.kt
@@ -2,12 +2,9 @@ package eu.kanade.tachiyomi.extension.en.manhuaga
import eu.kanade.tachiyomi.multisrc.madara.Madara
import okhttp3.OkHttpClient
-import java.util.concurrent.TimeUnit
class Manhuaga : Madara("Manhuaga", "https://manhuaga.com", "en") {
- override val client: OkHttpClient = network.cloudflareClient.newBuilder()
- .connectTimeout(10, TimeUnit.SECONDS)
- .readTimeout(30, TimeUnit.SECONDS)
+ override val client: OkHttpClient = super.client.newBuilder()
.addInterceptor { chain ->
val originalRequest = chain.request()
chain.proceed(originalRequest).let { response ->
diff --git a/multisrc/overrides/madara/manhuamanhwa/src/ManhuaManhwa.kt b/multisrc/overrides/madara/manhuamanhwa/src/ManhuaManhwa.kt
new file mode 100644
index 0000000000..ee089eb82e
--- /dev/null
+++ b/multisrc/overrides/madara/manhuamanhwa/src/ManhuaManhwa.kt
@@ -0,0 +1,17 @@
+package eu.kanade.tachiyomi.extension.en.manhuamanhwa
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+import java.text.SimpleDateFormat
+import java.util.Locale
+
+class ManhuaManhwa : Madara(
+ "ManhuaManhwa",
+ "https://manhuamanhwa.com",
+ "en",
+ dateFormat = SimpleDateFormat("dd/MM/yyyy", Locale.ROOT),
+) {
+ 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/manhuamanhwaonline/src/ManhuaManhwaOnline.kt b/multisrc/overrides/madara/manhuamanhwaonline/src/ManhuaManhwaOnline.kt
new file mode 100644
index 0000000000..81aea3a59d
--- /dev/null
+++ b/multisrc/overrides/madara/manhuamanhwaonline/src/ManhuaManhwaOnline.kt
@@ -0,0 +1,9 @@
+package eu.kanade.tachiyomi.extension.en.manhuamanhwaonline
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+
+class ManhuaManhwaOnline : Madara("ManhuaManhwa.online", "https://manhuamanhwa.online", "en") {
+ override val useNewChapterEndpoint = false
+
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
+}
diff --git a/multisrc/overrides/madara/manhuascaninfo/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/manhuascaninfo/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..efeb9ba0bb
Binary files /dev/null and b/multisrc/overrides/madara/manhuascaninfo/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/manhuascaninfo/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/manhuascaninfo/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..ceae6c6035
Binary files /dev/null and b/multisrc/overrides/madara/manhuascaninfo/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/manhuascaninfo/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/manhuascaninfo/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..ebbe319321
Binary files /dev/null and b/multisrc/overrides/madara/manhuascaninfo/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/manhuascaninfo/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/manhuascaninfo/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..1d5c406d0e
Binary files /dev/null and b/multisrc/overrides/madara/manhuascaninfo/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/manhuascaninfo/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/manhuascaninfo/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..77b6bef37f
Binary files /dev/null and b/multisrc/overrides/madara/manhuascaninfo/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/manhuascaninfo/res/web_hi_res_512.png b/multisrc/overrides/madara/manhuascaninfo/res/web_hi_res_512.png
new file mode 100644
index 0000000000..79d6a8907d
Binary files /dev/null and b/multisrc/overrides/madara/manhuascaninfo/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/manhuascaninfo/src/ManhuaScanInfo.kt b/multisrc/overrides/madara/manhuascaninfo/src/ManhuaScanInfo.kt
new file mode 100644
index 0000000000..7a88dd1db6
--- /dev/null
+++ b/multisrc/overrides/madara/manhuascaninfo/src/ManhuaScanInfo.kt
@@ -0,0 +1,9 @@
+package eu.kanade.tachiyomi.extension.en.manhuascaninfo
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+
+class ManhuaScanInfo : Madara("ManhuaScan.info (unoriginal)", "https://manhuascan.info", "en") {
+ override val useNewChapterEndpoint = false
+
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
+}
diff --git a/multisrc/overrides/madara/manhuasnet/src/Manhuasnet.kt b/multisrc/overrides/madara/manhuasnet/src/Manhuasnet.kt
new file mode 100644
index 0000000000..c29ceaa3e9
--- /dev/null
+++ b/multisrc/overrides/madara/manhuasnet/src/Manhuasnet.kt
@@ -0,0 +1,7 @@
+package eu.kanade.tachiyomi.extension.en.manhuasnet
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+
+class Manhuasnet : Madara("Manhua Mix", "https://manhuamix.com", "en") {
+ override val id = 4574243309965401439
+}
diff --git a/multisrc/overrides/madara/manhuazone/src/ManhuaZone.kt b/multisrc/overrides/madara/manhuazone/src/ManhuaZone.kt
index 40ecca00de..9200087269 100644
--- a/multisrc/overrides/madara/manhuazone/src/ManhuaZone.kt
+++ b/multisrc/overrides/madara/manhuazone/src/ManhuaZone.kt
@@ -6,7 +6,7 @@ import java.util.Locale
class ManhuaZone : Madara(
"ManhuaZone",
- "https://manhuazone.com",
+ "https://manhuazone.org",
"en",
dateFormat = SimpleDateFormat("MMM d, yyyy", Locale.US),
)
diff --git a/multisrc/overrides/madara/manhuazonghe/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/manhuazonghe/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..850514942e
Binary files /dev/null and b/multisrc/overrides/madara/manhuazonghe/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/manhuazonghe/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/manhuazonghe/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..d9a552289e
Binary files /dev/null and b/multisrc/overrides/madara/manhuazonghe/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/manhuazonghe/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/manhuazonghe/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..8d4402cd23
Binary files /dev/null and b/multisrc/overrides/madara/manhuazonghe/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/manhuazonghe/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/manhuazonghe/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..9fa5ca3503
Binary files /dev/null and b/multisrc/overrides/madara/manhuazonghe/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/manhuazonghe/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/manhuazonghe/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..94188edc3f
Binary files /dev/null and b/multisrc/overrides/madara/manhuazonghe/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/manhuazonghe/res/web_hi_res_512.png b/multisrc/overrides/madara/manhuazonghe/res/web_hi_res_512.png
new file mode 100644
index 0000000000..c01736a24a
Binary files /dev/null and b/multisrc/overrides/madara/manhuazonghe/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/manhuazonghe/src/ManhuaZonghe.kt b/multisrc/overrides/madara/manhuazonghe/src/ManhuaZonghe.kt
new file mode 100644
index 0000000000..212ec0eb0e
--- /dev/null
+++ b/multisrc/overrides/madara/manhuazonghe/src/ManhuaZonghe.kt
@@ -0,0 +1,11 @@
+package eu.kanade.tachiyomi.extension.en.manhuazonghe
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+
+class ManhuaZonghe : Madara("Manhua Zonghe", "https://manhuazonghe.com", "en") {
+ override val useNewChapterEndpoint = false
+ override val filterNonMangaItems = false
+ override val mangaSubString = "manhua"
+
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
+}
diff --git a/multisrc/overrides/madara/manhwa2read/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/manhwa2read/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..98e209fcec
Binary files /dev/null and b/multisrc/overrides/madara/manhwa2read/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/manhwa2read/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/manhwa2read/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..b99e0beb64
Binary files /dev/null and b/multisrc/overrides/madara/manhwa2read/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/manhwa2read/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/manhwa2read/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..afa675f202
Binary files /dev/null and b/multisrc/overrides/madara/manhwa2read/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/manhwa2read/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/manhwa2read/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..01ed05c3b3
Binary files /dev/null and b/multisrc/overrides/madara/manhwa2read/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/manhwa2read/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/manhwa2read/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..71ef3de1cc
Binary files /dev/null and b/multisrc/overrides/madara/manhwa2read/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/manhwa2read/res/web_hi_res_512.png b/multisrc/overrides/madara/manhwa2read/res/web_hi_res_512.png
new file mode 100644
index 0000000000..cfc34d4db7
Binary files /dev/null and b/multisrc/overrides/madara/manhwa2read/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/manhwa2read/src/Manhwa2Read.kt b/multisrc/overrides/madara/manhwa2read/src/Manhwa2Read.kt
new file mode 100644
index 0000000000..fbd6a15717
--- /dev/null
+++ b/multisrc/overrides/madara/manhwa2read/src/Manhwa2Read.kt
@@ -0,0 +1,9 @@
+package eu.kanade.tachiyomi.extension.en.manhwa2read
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+
+class Manhwa2Read : Madara("Manhwa2Read", "https://manhwa2read.com", "en") {
+ override val useNewChapterEndpoint = true
+
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
+}
diff --git a/multisrc/overrides/madara/manhwadashraw/src/ManhwaDashRaw.kt b/multisrc/overrides/madara/manhwadashraw/src/ManhwaDashRaw.kt
index 125fc5276e..934c25d3fa 100644
--- a/multisrc/overrides/madara/manhwadashraw/src/ManhwaDashRaw.kt
+++ b/multisrc/overrides/madara/manhwadashraw/src/ManhwaDashRaw.kt
@@ -11,4 +11,8 @@ class ManhwaDashRaw : Madara(
dateFormat = SimpleDateFormat("dd/MM/yyy", Locale.ROOT),
) {
override val useNewChapterEndpoint = true
+
+ override val mangaDetailsSelectorStatus = "div.post-content_item:contains(Status) > div.summary-content"
+ override val mangaDetailsSelectorDescription = "div.post-content_item:contains(Summary) div.summary-container"
+ override val pageListParseSelector = "div.page-break img.wp-manga-chapter-img"
}
diff --git a/multisrc/overrides/madara/manhwalatino/src/ManhwaLatino.kt b/multisrc/overrides/madara/manhwalatino/src/ManhwaLatino.kt
index 9222c3e481..89924f5726 100644
--- a/multisrc/overrides/madara/manhwalatino/src/ManhwaLatino.kt
+++ b/multisrc/overrides/madara/manhwalatino/src/ManhwaLatino.kt
@@ -1,6 +1,11 @@
package eu.kanade.tachiyomi.extension.es.manhwalatino
import eu.kanade.tachiyomi.multisrc.madara.Madara
+import eu.kanade.tachiyomi.source.model.SChapter
+import okhttp3.MediaType.Companion.toMediaTypeOrNull
+import okhttp3.OkHttpClient
+import okhttp3.ResponseBody.Companion.toResponseBody
+import org.jsoup.nodes.Element
import java.text.SimpleDateFormat
import java.util.Locale
@@ -11,11 +16,49 @@ class ManhwaLatino : Madara(
SimpleDateFormat("dd/MM/yyyy", Locale("es")),
) {
- override val supportsLatest = false
+ override val client: OkHttpClient = super.client.newBuilder()
+ .addInterceptor { chain ->
+ val request = chain.request()
+ val headers = request.headers.newBuilder()
+ .removeAll("Accept-Encoding")
+ .build()
+ val response = chain.proceed(request.newBuilder().headers(headers).build())
+ if (response.headers("Content-Type").contains("application/octet-stream") && response.request.url.toString().endsWith(".jpg")) {
+ val orgBody = response.body.bytes()
+ val newBody = orgBody.toResponseBody("image/jpeg".toMediaTypeOrNull())
+ response.newBuilder()
+ .body(newBody)
+ .build()
+ } else {
+ response
+ }
+ }
+ .build()
override val useNewChapterEndpoint = true
- override val chapterUrlSelector = "a:eq(1)"
+ override val chapterUrlSelector = "div.mini-letters > a"
override val mangaDetailsSelectorStatus = "div.post-content_item:contains(Estado del comic) > div.summary-content"
+ override val mangaDetailsSelectorDescription = "div.post-content_item:contains(Resumen) div.summary-container"
+ override val pageListParseSelector = "div.page-break img.wp-manga-chapter-img"
+
+ override fun chapterFromElement(element: Element): SChapter {
+ val chapter = SChapter.create()
+
+ with(element) {
+ select(chapterUrlSelector).first()?.let { urlElement ->
+ chapter.url = urlElement.attr("abs:href").let {
+ it.substringBefore("?style=paged") + if (!it.endsWith(chapterUrlSuffix)) chapterUrlSuffix else ""
+ }
+ chapter.name = urlElement.wholeText().substringAfter("\n")
+ }
+
+ chapter.date_upload = select("img:not(.thumb)").firstOrNull()?.attr("alt")?.let { parseRelativeDate(it) }
+ ?: select("span a").firstOrNull()?.attr("title")?.let { parseRelativeDate(it) }
+ ?: parseChapterDate(select(chapterDateSelector()).firstOrNull()?.text())
+ }
+
+ return chapter
+ }
}
diff --git a/multisrc/overrides/madara/manhwamanhua/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/manhwamanhua/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..b3f3b1a35c
Binary files /dev/null and b/multisrc/overrides/madara/manhwamanhua/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/manhwamanhua/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/manhwamanhua/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..ab7cb5721d
Binary files /dev/null and b/multisrc/overrides/madara/manhwamanhua/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/manhwamanhua/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/manhwamanhua/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..d88ac01357
Binary files /dev/null and b/multisrc/overrides/madara/manhwamanhua/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/manhwamanhua/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/manhwamanhua/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..c37ace6409
Binary files /dev/null and b/multisrc/overrides/madara/manhwamanhua/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/manhwamanhua/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/manhwamanhua/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..dfef5100c7
Binary files /dev/null and b/multisrc/overrides/madara/manhwamanhua/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/manhwamanhua/res/web_hi_res_512.png b/multisrc/overrides/madara/manhwamanhua/res/web_hi_res_512.png
new file mode 100644
index 0000000000..0b35f11598
Binary files /dev/null and b/multisrc/overrides/madara/manhwamanhua/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/manhwamanhua/src/ManhwaManhua.kt b/multisrc/overrides/madara/manhwamanhua/src/ManhwaManhua.kt
new file mode 100644
index 0000000000..db15b5db2b
--- /dev/null
+++ b/multisrc/overrides/madara/manhwamanhua/src/ManhwaManhua.kt
@@ -0,0 +1,10 @@
+package eu.kanade.tachiyomi.extension.en.manhwamanhua
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+
+class ManhwaManhua : Madara("ManhwaManhua", "https://manhwamanhua.com", "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/manhwanew/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/manhwanew/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..63c13ede7d
Binary files /dev/null and b/multisrc/overrides/madara/manhwanew/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/manhwanew/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/manhwanew/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..c75ee6c3ff
Binary files /dev/null and b/multisrc/overrides/madara/manhwanew/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/manhwanew/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/manhwanew/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..eab92c6bd3
Binary files /dev/null and b/multisrc/overrides/madara/manhwanew/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/manhwanew/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/manhwanew/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..8af570d5cb
Binary files /dev/null and b/multisrc/overrides/madara/manhwanew/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/manhwanew/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/manhwanew/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..cc67d8eb86
Binary files /dev/null and b/multisrc/overrides/madara/manhwanew/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/manhwanew/res/web_hi_res_512.png b/multisrc/overrides/madara/manhwanew/res/web_hi_res_512.png
new file mode 100644
index 0000000000..7cf4f91729
Binary files /dev/null and b/multisrc/overrides/madara/manhwanew/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/manhwanew/src/ManhwaNew.kt b/multisrc/overrides/madara/manhwanew/src/ManhwaNew.kt
new file mode 100644
index 0000000000..17be4d42d6
--- /dev/null
+++ b/multisrc/overrides/madara/manhwanew/src/ManhwaNew.kt
@@ -0,0 +1,17 @@
+package eu.kanade.tachiyomi.extension.en.manhwanew
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+import java.text.SimpleDateFormat
+import java.util.Locale
+
+class ManhwaNew : Madara(
+ "ManhwaNew",
+ "https://manhwanew.com",
+ "en",
+ dateFormat = SimpleDateFormat("dd/MM/yyyy", Locale.ROOT),
+) {
+ 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/manhwatime/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/manhwatime/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index f2d1811d7a..0000000000
Binary files a/multisrc/overrides/madara/manhwatime/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/manhwatime/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/manhwatime/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index d3f374d6fe..0000000000
Binary files a/multisrc/overrides/madara/manhwatime/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/manhwatime/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/manhwatime/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 2245b31e53..0000000000
Binary files a/multisrc/overrides/madara/manhwatime/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/manhwatime/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/manhwatime/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 51e88c01c7..0000000000
Binary files a/multisrc/overrides/madara/manhwatime/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/manhwatime/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/manhwatime/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 771b5c7ddd..0000000000
Binary files a/multisrc/overrides/madara/manhwatime/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/manhwatime/res/web_hi_res_512.png b/multisrc/overrides/madara/manhwatime/res/web_hi_res_512.png
deleted file mode 100644
index f3d7131af3..0000000000
Binary files a/multisrc/overrides/madara/manhwatime/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/madara/manhwaworld/src/ManhwaWorld.kt b/multisrc/overrides/madara/manhwaworld/src/ManhwaWorld.kt
new file mode 100644
index 0000000000..5432baef6f
--- /dev/null
+++ b/multisrc/overrides/madara/manhwaworld/src/ManhwaWorld.kt
@@ -0,0 +1,7 @@
+package eu.kanade.tachiyomi.extension.en.manhwaworld
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+
+class ManhwaWorld : Madara("AQUA Scans", "https://aquascans.com", "en") {
+ override val id = 8857833474626810640
+}
diff --git a/multisrc/overrides/madara/mantrazscan/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/mantrazscan/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..d2aa736cba
Binary files /dev/null and b/multisrc/overrides/madara/mantrazscan/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mantrazscan/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/mantrazscan/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..158cc31306
Binary files /dev/null and b/multisrc/overrides/madara/mantrazscan/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mantrazscan/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/mantrazscan/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..67dc81edd5
Binary files /dev/null and b/multisrc/overrides/madara/mantrazscan/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mantrazscan/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/mantrazscan/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..0e76feae7c
Binary files /dev/null and b/multisrc/overrides/madara/mantrazscan/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mantrazscan/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/mantrazscan/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..a91ea2d3a6
Binary files /dev/null and b/multisrc/overrides/madara/mantrazscan/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/mantrazscan/res/web_hi_res_512.png b/multisrc/overrides/madara/mantrazscan/res/web_hi_res_512.png
new file mode 100644
index 0000000000..0c24dc41c5
Binary files /dev/null and b/multisrc/overrides/madara/mantrazscan/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/mantrazscan/src/MantrazScan.kt b/multisrc/overrides/madara/mantrazscan/src/MantrazScan.kt
new file mode 100644
index 0000000000..6b1ed6b149
--- /dev/null
+++ b/multisrc/overrides/madara/mantrazscan/src/MantrazScan.kt
@@ -0,0 +1,14 @@
+package eu.kanade.tachiyomi.extension.es.mantrazscan
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+import java.text.SimpleDateFormat
+import java.util.Locale
+
+class MantrazScan : Madara(
+ "Mantraz Scan",
+ "https://mantrazscan.com",
+ "es",
+ SimpleDateFormat("dd/MM/yyyy", Locale("es")),
+) {
+ override val useNewChapterEndpoint = true
+}
diff --git a/multisrc/overrides/madara/manytoonclub/src/ManyToonClub.kt b/multisrc/overrides/madara/manytoonclub/src/ManyToonClub.kt
new file mode 100644
index 0000000000..db227c5328
--- /dev/null
+++ b/multisrc/overrides/madara/manytoonclub/src/ManyToonClub.kt
@@ -0,0 +1,11 @@
+package eu.kanade.tachiyomi.extension.ko.manytoonclub
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+
+class ManyToonClub : Madara("ManyToonClub", "https://manytoon.club", "ko") {
+
+ override val mangaSubString = "manhwa-raw"
+
+ // The website does not flag the content.
+ override val filterNonMangaItems = false
+}
diff --git a/multisrc/overrides/madara/manytoonme/src/ManyToonMe.kt b/multisrc/overrides/madara/manytoonme/src/ManyToonMe.kt
index fb4c05fbe5..b4446e55eb 100644
--- a/multisrc/overrides/madara/manytoonme/src/ManyToonMe.kt
+++ b/multisrc/overrides/madara/manytoonme/src/ManyToonMe.kt
@@ -4,8 +4,7 @@ import eu.kanade.tachiyomi.multisrc.madara.Madara
class ManyToonMe : Madara("ManyToon.me", "https://manytoon.me", "en") {
- override val useNewChapterEndpoint: Boolean = true
+ override val mangaSubString = "comic"
- // The website does not flag the content.
- override val filterNonMangaItems = false
+ override val useNewChapterEndpoint: Boolean = true
}
diff --git a/multisrc/overrides/madara/mgkomik/src/MGKomik.kt b/multisrc/overrides/madara/mgkomik/src/MGKomik.kt
index d0d08cd82c..30febe8ad5 100644
--- a/multisrc/overrides/madara/mgkomik/src/MGKomik.kt
+++ b/multisrc/overrides/madara/mgkomik/src/MGKomik.kt
@@ -1,13 +1,46 @@
package eu.kanade.tachiyomi.extension.id.mgkomik
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
+import java.util.concurrent.TimeUnit
+import kotlin.random.Random
-class MGKomik : Madara("MG Komik", "https://mgkomik.com", "id", SimpleDateFormat("dd MMM yy", Locale.US)) {
+class MGKomik : Madara("MG Komik", "https://mgkomik.id", "id", SimpleDateFormat("dd MMM yy", Locale.US)) {
+
+ override val client: OkHttpClient = super.client.newBuilder()
+ .rateLimit(20, 5, TimeUnit.SECONDS)
+ .build()
+
+ override fun headersBuilder(): Headers.Builder = super.headersBuilder()
+ .add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8")
+ .add("Accept-Language", "en-US,en;q=0.9,id;q=0.8")
+ .add("Sec-Fetch-Dest", "document")
+ .add("Sec-Fetch-Mode", "navigate")
+ .add("Sec-Fetch-Site", "same-origin")
+ .add("Sec-Fetch-User", "?1")
+ .add("Upgrade-Insecure-Requests", "1")
+ .add("X-Requested-With", randomString)
+
+ private fun generateRandomString(length: Int): String {
+ val charset = "HALOGaES.BCDFHIJKMNPQRTUVWXYZ.bcdefghijklmnopqrstuvwxyz0123456789"
+ return (1..length)
+ .map { charset.random() }
+ .joinToString("")
+ }
+
+ override fun searchPage(page: Int): String = if (page > 1) "page/$page/" else ""
+
+ private val randomLength = Random.Default.nextInt(13, 21)
+
+ private val randomString = generateRandomString(randomLength)
- override val chapterUrlSuffix = ""
override val mangaSubString = "komik"
override fun searchMangaNextPageSelector() = "a.page.larger"
+
+ override val chapterUrlSuffix = ""
}
diff --git a/multisrc/overrides/madara/mhentais/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/mhentais/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index c0e871a856..0000000000
Binary files a/multisrc/overrides/madara/mhentais/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/mhentais/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/mhentais/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index 2ba963c405..0000000000
Binary files a/multisrc/overrides/madara/mhentais/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/mhentais/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/mhentais/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index e703dac92c..0000000000
Binary files a/multisrc/overrides/madara/mhentais/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/mhentais/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/mhentais/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index e444d3c6c9..0000000000
Binary files a/multisrc/overrides/madara/mhentais/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/mhentais/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/mhentais/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index c5b58f2be4..0000000000
Binary files a/multisrc/overrides/madara/mhentais/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/mhentais/res/web_hi_res_512.png b/multisrc/overrides/madara/mhentais/res/web_hi_res_512.png
deleted file mode 100644
index cbd7a4e2e8..0000000000
Binary files a/multisrc/overrides/madara/mhentais/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/madara/mhentais/src/MHentais.kt b/multisrc/overrides/madara/mhentais/src/MHentais.kt
deleted file mode 100644
index 11f59b8db2..0000000000
--- a/multisrc/overrides/madara/mhentais/src/MHentais.kt
+++ /dev/null
@@ -1,20 +0,0 @@
-package eu.kanade.tachiyomi.extension.pt.mhentais
-
-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 MHentais : Madara(
- "MHentais",
- "https://mhentais.com",
- "pt-BR",
- SimpleDateFormat("dd/MM/yyyy", Locale("pt", "BR")),
-) {
-
- override val client: OkHttpClient = super.client.newBuilder()
- .rateLimit(1, 2, TimeUnit.SECONDS)
- .build()
-}
diff --git a/multisrc/overrides/madara/miradscanlator/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/miradscanlator/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index bd2eac9693..0000000000
Binary files a/multisrc/overrides/madara/miradscanlator/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/miradscanlator/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/miradscanlator/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index fba0c24d7a..0000000000
Binary files a/multisrc/overrides/madara/miradscanlator/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/miradscanlator/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/miradscanlator/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index e3566e414c..0000000000
Binary files a/multisrc/overrides/madara/miradscanlator/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/miradscanlator/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/miradscanlator/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 002d184571..0000000000
Binary files a/multisrc/overrides/madara/miradscanlator/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/miradscanlator/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/miradscanlator/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index add4646828..0000000000
Binary files a/multisrc/overrides/madara/miradscanlator/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/miradscanlator/res/web_hi_res_512.png b/multisrc/overrides/madara/miradscanlator/res/web_hi_res_512.png
deleted file mode 100644
index d21da04a1e..0000000000
Binary files a/multisrc/overrides/madara/miradscanlator/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/madara/miradscanlator/src/MiradScanlator.kt b/multisrc/overrides/madara/miradscanlator/src/MiradScanlator.kt
deleted file mode 100644
index 747eb3d13a..0000000000
--- a/multisrc/overrides/madara/miradscanlator/src/MiradScanlator.kt
+++ /dev/null
@@ -1,20 +0,0 @@
-package eu.kanade.tachiyomi.extension.pt.miradscanlator
-
-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 MiradScanlator : Madara(
- "Mirad Scanlator",
- "https://miradscanlator.site",
- "pt-BR",
- SimpleDateFormat("dd/MM/yyyy", Locale("pt-BR")),
-) {
-
- override val client: OkHttpClient = super.client.newBuilder()
- .rateLimit(1, 2, TimeUnit.SECONDS)
- .build()
-}
diff --git a/multisrc/overrides/madara/mixedmanga/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/mixedmanga/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index a1e0c966fa..0000000000
Binary files a/multisrc/overrides/madara/mixedmanga/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/mixedmanga/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/mixedmanga/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index c521ce4271..0000000000
Binary files a/multisrc/overrides/madara/mixedmanga/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/mixedmanga/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/mixedmanga/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 7eae140636..0000000000
Binary files a/multisrc/overrides/madara/mixedmanga/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/mixedmanga/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/mixedmanga/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index cb2a877820..0000000000
Binary files a/multisrc/overrides/madara/mixedmanga/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/mixedmanga/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/mixedmanga/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 2ff3eddd82..0000000000
Binary files a/multisrc/overrides/madara/mixedmanga/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/mixedmanga/res/web_hi_res_512.png b/multisrc/overrides/madara/mixedmanga/res/web_hi_res_512.png
deleted file mode 100644
index ed3fce2a14..0000000000
Binary files a/multisrc/overrides/madara/mixedmanga/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/madara/mixedmanga/src/MixedManga.kt b/multisrc/overrides/madara/mixedmanga/src/MixedManga.kt
deleted file mode 100644
index 13c9f89349..0000000000
--- a/multisrc/overrides/madara/mixedmanga/src/MixedManga.kt
+++ /dev/null
@@ -1,10 +0,0 @@
-package eu.kanade.tachiyomi.extension.en.mixedmanga
-
-import eu.kanade.tachiyomi.multisrc.madara.Madara
-import okhttp3.Headers
-import java.text.SimpleDateFormat
-import java.util.Locale
-
-class MixedManga : Madara("Mixed Manga", "https://mixedmanga.com", "en", SimpleDateFormat("d MMM yyyy", Locale.US)) {
- override fun headersBuilder(): Headers.Builder = super.headersBuilder().add("Referer", baseUrl)
-}
diff --git a/multisrc/overrides/madara/mmscans/src/MMScans.kt b/multisrc/overrides/madara/mmscans/src/MMScans.kt
index db859e4ba4..03252b7a70 100644
--- a/multisrc/overrides/madara/mmscans/src/MMScans.kt
+++ b/multisrc/overrides/madara/mmscans/src/MMScans.kt
@@ -1,8 +1,11 @@
package eu.kanade.tachiyomi.extension.en.mmscans
import eu.kanade.tachiyomi.multisrc.madara.Madara
+import eu.kanade.tachiyomi.network.POST
import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga
+import okhttp3.FormBody
+import okhttp3.Request
import org.jsoup.nodes.Element
class MMScans : Madara("MMScans", "https://mm-scans.org", "en") {
@@ -12,8 +15,47 @@ class MMScans : Madara("MMScans", "https://mm-scans.org", "en") {
override val popularMangaUrlSelector = "div.item-summary a"
override fun chapterListSelector() = "li.chapter-li"
- override fun searchMangaSelector() = "a"
+ override fun searchMangaSelector() = ".search-wrap >.tab-content-wrap > a"
+ override fun searchMangaNextPageSelector(): String? = "body:not(:has(.no-posts))"
+ fun oldLoadMoreRequest(page: Int, metaKey: String): Request {
+ val form = FormBody.Builder()
+ .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", form.contentLength().toString())
+ .add("Content-Type", form.contentType().toString())
+ .add("X-Requested-With", "XMLHttpRequest")
+ .build()
+
+ return POST("$baseUrl/wp-admin/admin-ajax.php", xhrHeaders, form)
+ }
+
+ override fun popularMangaRequest(page: Int): Request {
+ return oldLoadMoreRequest(page - 1, "_wp_manga_views")
+ }
+ override fun latestUpdatesRequest(page: Int): Request {
+ return oldLoadMoreRequest(page - 1, "_latest_update")
+ }
override fun popularMangaFromElement(element: Element): SManga {
val manga = SManga.create()
diff --git a/multisrc/overrides/madara/myuniversescanlator/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/myuniversescanlator/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index dbc382eae8..0000000000
Binary files a/multisrc/overrides/madara/myuniversescanlator/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/myuniversescanlator/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/myuniversescanlator/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index a3eade6e72..0000000000
Binary files a/multisrc/overrides/madara/myuniversescanlator/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/myuniversescanlator/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/myuniversescanlator/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index acd05f899a..0000000000
Binary files a/multisrc/overrides/madara/myuniversescanlator/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/myuniversescanlator/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/myuniversescanlator/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index f22255ba8b..0000000000
Binary files a/multisrc/overrides/madara/myuniversescanlator/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/myuniversescanlator/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/myuniversescanlator/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index b473a5828d..0000000000
Binary files a/multisrc/overrides/madara/myuniversescanlator/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/myuniversescanlator/res/web_hi_res_512.png b/multisrc/overrides/madara/myuniversescanlator/res/web_hi_res_512.png
deleted file mode 100644
index f4199f3c76..0000000000
Binary files a/multisrc/overrides/madara/myuniversescanlator/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/madara/myuniversescanlator/src/MyUniverseScanlator.kt b/multisrc/overrides/madara/myuniversescanlator/src/MyUniverseScanlator.kt
deleted file mode 100644
index 3ddee38a81..0000000000
--- a/multisrc/overrides/madara/myuniversescanlator/src/MyUniverseScanlator.kt
+++ /dev/null
@@ -1,22 +0,0 @@
-package eu.kanade.tachiyomi.extension.pt.myuniversescanlator
-
-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 MyUniverseScanlator : Madara(
- "My Universe Scanlator",
- "https://muscan.com.br",
- "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/nekobreakerscan/src/NekoBreakerScan.kt b/multisrc/overrides/madara/nekobreakerscan/src/NekoBreakerScan.kt
deleted file mode 100644
index 258cfc600a..0000000000
--- a/multisrc/overrides/madara/nekobreakerscan/src/NekoBreakerScan.kt
+++ /dev/null
@@ -1,17 +0,0 @@
-package eu.kanade.tachiyomi.extension.pt.nekobreakerscan
-
-import eu.kanade.tachiyomi.multisrc.madara.Madara
-import okhttp3.OkHttpClient
-import java.text.SimpleDateFormat
-import java.util.Locale
-
-class NekoBreakerScan : Madara(
- "NekoBreaker Scan",
- "https://nekobreakerscan.com",
- "pt-BR",
- SimpleDateFormat("MMMMM dd, yyyy", Locale("pt", "BR")),
-) {
-
- override val client: OkHttpClient = super.client.newBuilder()
- .build()
-}
diff --git a/multisrc/overrides/madara/nekopostco/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/nekopostco/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..9a3861d3e0
Binary files /dev/null and b/multisrc/overrides/madara/nekopostco/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/nekopostco/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/nekopostco/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..d6f802b833
Binary files /dev/null and b/multisrc/overrides/madara/nekopostco/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/nekopostco/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/nekopostco/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..4a678c8e43
Binary files /dev/null and b/multisrc/overrides/madara/nekopostco/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/nekopostco/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/nekopostco/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..a2ef8a6450
Binary files /dev/null and b/multisrc/overrides/madara/nekopostco/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/nekopostco/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/nekopostco/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..90feb1ac29
Binary files /dev/null and b/multisrc/overrides/madara/nekopostco/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/nekopostco/res/web_hi_res_512.png b/multisrc/overrides/madara/nekopostco/res/web_hi_res_512.png
new file mode 100644
index 0000000000..8f8ae9aa78
Binary files /dev/null and b/multisrc/overrides/madara/nekopostco/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/nekopostco/src/NekoPostCo.kt b/multisrc/overrides/madara/nekopostco/src/NekoPostCo.kt
new file mode 100644
index 0000000000..e6f41d5541
--- /dev/null
+++ b/multisrc/overrides/madara/nekopostco/src/NekoPostCo.kt
@@ -0,0 +1,16 @@
+package eu.kanade.tachiyomi.extension.th.nekopostco
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+import java.text.SimpleDateFormat
+import java.util.Locale
+
+class NekoPostCo : Madara(
+ "NekoPost.co (unoriginal)",
+ "https://www.nekopost.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/ninjascan/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/ninjascan/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index fe4fc4642f..0000000000
Binary files a/multisrc/overrides/madara/ninjascan/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/ninjascan/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/ninjascan/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index 5ff9fabb2e..0000000000
Binary files a/multisrc/overrides/madara/ninjascan/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/ninjascan/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/ninjascan/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index d8840bfc65..0000000000
Binary files a/multisrc/overrides/madara/ninjascan/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/ninjascan/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/ninjascan/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 1a5cf14e47..0000000000
Binary files a/multisrc/overrides/madara/ninjascan/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/ninjascan/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/ninjascan/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 6dc40fdd12..0000000000
Binary files a/multisrc/overrides/madara/ninjascan/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/ninjascan/res/web_hi_res_512.png b/multisrc/overrides/madara/ninjascan/res/web_hi_res_512.png
deleted file mode 100644
index f7a2288a7c..0000000000
Binary files a/multisrc/overrides/madara/ninjascan/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/madara/ninjascan/src/NinjaScan.kt b/multisrc/overrides/madara/ninjascan/src/NinjaScan.kt
deleted file mode 100644
index a74850c7e3..0000000000
--- a/multisrc/overrides/madara/ninjascan/src/NinjaScan.kt
+++ /dev/null
@@ -1,20 +0,0 @@
-package eu.kanade.tachiyomi.extension.pt.ninjascan
-
-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 NinjaScan : Madara(
- "Ninja Scan",
- "https://ninjascan.xyz",
- "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/nitroscans/src/NitroScans.kt b/multisrc/overrides/madara/nitroscans/src/NitroScans.kt
new file mode 100644
index 0000000000..a04aff3ed3
--- /dev/null
+++ b/multisrc/overrides/madara/nitroscans/src/NitroScans.kt
@@ -0,0 +1,15 @@
+package eu.kanade.tachiyomi.extension.en.nitroscans
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+
+class NitroScans : Madara("Nitro Manga", "https://nitromanga.com", "en") {
+ override val id = 1310352166897986481
+
+ override val mangaSubString = "mangas"
+
+ override val filterNonMangaItems = false
+
+ override val useNewChapterEndpoint = true
+
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
+}
diff --git a/multisrc/overrides/madara/noblessetranslations/src/NoblesseTranslations.kt b/multisrc/overrides/madara/noblessetranslations/src/NoblesseTranslations.kt
index e23f5005cb..da3b11061f 100644
--- a/multisrc/overrides/madara/noblessetranslations/src/NoblesseTranslations.kt
+++ b/multisrc/overrides/madara/noblessetranslations/src/NoblesseTranslations.kt
@@ -1,14 +1,57 @@
package eu.kanade.tachiyomi.extension.es.noblessetranslations
import eu.kanade.tachiyomi.multisrc.madara.Madara
+import eu.kanade.tachiyomi.network.POST
+import okhttp3.FormBody
+import okhttp3.Request
import java.text.SimpleDateFormat
import java.util.Locale
class NoblesseTranslations : Madara(
"Noblesse Translations",
- "https://www.noblessetranslations.com",
+ "https://noblessetranslations.com",
"es",
- dateFormat = SimpleDateFormat("dd/MM/yy", Locale.ROOT),
+ dateFormat = SimpleDateFormat("MMMM d, yyyy", Locale("es")),
) {
override val useNewChapterEndpoint = true
+ override val mangaSubString = "proyecto"
+
+ override fun popularMangaNextPageSelector() = "body:not(:has(.no-posts))"
+
+ override val mangaDetailsSelectorStatus = "div.summary_content > div.post-content div.post-content_item:has(div.summary-heading:contains(Status)) div.summary-content"
+ override val mangaDetailsSelectorTag = "div.tags-content a.notUsed" // Site uses this for the scanlator
+
+ private fun loadMoreRequest(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]", "full")
+ add("vars[post_type]", "wp-manga")
+ add("vars[post_status]", "publish")
+ add("vars[meta_key]", metaKey)
+ add("vars[order]", "desc")
+ add("vars[meta_query][relation]", "AND")
+ add("vars[manga_archives_item_layout]", "big_thumbnail")
+ }.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 loadMoreRequest(page - 1, "_wp_manga_views")
+ }
+
+ override fun latestUpdatesRequest(page: Int): Request {
+ return loadMoreRequest(page - 1, "_latest_update")
+ }
}
diff --git a/multisrc/overrides/madara/onlymanhwa/src/OnlyManhwa.kt b/multisrc/overrides/madara/onlymanhwa/src/OnlyManhwa.kt
new file mode 100644
index 0000000000..5013f8987f
--- /dev/null
+++ b/multisrc/overrides/madara/onlymanhwa/src/OnlyManhwa.kt
@@ -0,0 +1,18 @@
+package eu.kanade.tachiyomi.extension.en.onlymanhwa
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+import java.text.SimpleDateFormat
+import java.util.Locale
+
+class OnlyManhwa : Madara(
+ "OnlyManhwa",
+ "https://onlymanhwa.org",
+ "en",
+ dateFormat = SimpleDateFormat("d 'de' MMMM 'de' yyyy", Locale.ENGLISH),
+) {
+ override val useNewChapterEndpoint = true
+ override val mangaSubString = "manhwa"
+ 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/painfulnightzscan/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/painfulnightzscan/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index b7265edbed..0000000000
Binary files a/multisrc/overrides/madara/painfulnightzscan/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/painfulnightzscan/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/painfulnightzscan/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index 3b2b356e76..0000000000
Binary files a/multisrc/overrides/madara/painfulnightzscan/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/painfulnightzscan/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/painfulnightzscan/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 619a03792d..0000000000
Binary files a/multisrc/overrides/madara/painfulnightzscan/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/painfulnightzscan/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/painfulnightzscan/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index ad77c4f45a..0000000000
Binary files a/multisrc/overrides/madara/painfulnightzscan/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/painfulnightzscan/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/painfulnightzscan/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 101ac61d6c..0000000000
Binary files a/multisrc/overrides/madara/painfulnightzscan/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/painfulnightzscan/res/web_hi_res_512.png b/multisrc/overrides/madara/painfulnightzscan/res/web_hi_res_512.png
deleted file mode 100644
index 5c7b5998fb..0000000000
Binary files a/multisrc/overrides/madara/painfulnightzscan/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/madara/paragonscans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/paragonscans/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..0cc5a3e4fb
Binary files /dev/null and b/multisrc/overrides/madara/paragonscans/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/paragonscans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/paragonscans/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..f5efd36d30
Binary files /dev/null and b/multisrc/overrides/madara/paragonscans/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/paragonscans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/paragonscans/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..2c91a0d84e
Binary files /dev/null and b/multisrc/overrides/madara/paragonscans/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/paragonscans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/paragonscans/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..b0ae9e84be
Binary files /dev/null and b/multisrc/overrides/madara/paragonscans/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/paragonscans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/paragonscans/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..30241a3c72
Binary files /dev/null and b/multisrc/overrides/madara/paragonscans/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/paragonscans/res/web_hi_res_512.png b/multisrc/overrides/madara/paragonscans/res/web_hi_res_512.png
new file mode 100644
index 0000000000..916b36beee
Binary files /dev/null and b/multisrc/overrides/madara/paragonscans/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/paragonscans/src/ParagonScans.kt b/multisrc/overrides/madara/paragonscans/src/ParagonScans.kt
new file mode 100644
index 0000000000..ef4d7ba70d
--- /dev/null
+++ b/multisrc/overrides/madara/paragonscans/src/ParagonScans.kt
@@ -0,0 +1,40 @@
+package eu.kanade.tachiyomi.extension.en.paragonscans
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+import java.text.SimpleDateFormat
+import java.util.Calendar
+import java.util.Locale
+
+class ParagonScans : Madara(
+ "Paragon Scans",
+ "https://paragonscans.com",
+ "en",
+ dateFormat = SimpleDateFormat("MM/dd/yyyy", Locale.ROOT),
+) {
+ override val useNewChapterEndpoint = true
+ override val mangaSubString = "mangax"
+
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
+
+ override fun parseChapterDate(date: String?): Long {
+ date ?: return 0
+
+ val splitDate = date.split(' ')
+ if (splitDate.size < 2) {
+ return super.parseChapterDate(date)
+ }
+
+ val (amountStr, unit) = splitDate
+ val amount = amountStr.toIntOrNull()
+ ?: return super.parseChapterDate(date)
+
+ val cal = Calendar.getInstance()
+ return when (unit) {
+ "s" -> cal.apply { add(Calendar.SECOND, -amount) }.timeInMillis // not observed
+ "m" -> cal.apply { add(Calendar.MINUTE, -amount) }.timeInMillis // not observed
+ "h" -> cal.apply { add(Calendar.HOUR_OF_DAY, -amount) }.timeInMillis
+ "d" -> cal.apply { add(Calendar.DAY_OF_MONTH, -amount) }.timeInMillis
+ else -> super.parseChapterDate(date)
+ }
+ }
+}
diff --git a/multisrc/overrides/madara/passamaoscan/src/PassaMaoScan.kt b/multisrc/overrides/madara/passamaoscan/src/PassaMaoScan.kt
new file mode 100644
index 0000000000..7eb437fb9d
--- /dev/null
+++ b/multisrc/overrides/madara/passamaoscan/src/PassaMaoScan.kt
@@ -0,0 +1,22 @@
+package eu.kanade.tachiyomi.extension.pt.passamaoscan
+
+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 PassaMaoScan : Madara(
+ "Passa Mão Scan",
+ "https://passamaoscan.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/pawmanga/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/pawmanga/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..0e5b55b8b7
Binary files /dev/null and b/multisrc/overrides/madara/pawmanga/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/pawmanga/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/pawmanga/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..8d78e85b8a
Binary files /dev/null and b/multisrc/overrides/madara/pawmanga/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/pawmanga/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/pawmanga/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..8442eba822
Binary files /dev/null and b/multisrc/overrides/madara/pawmanga/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/pawmanga/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/pawmanga/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..4b5b3cb52c
Binary files /dev/null and b/multisrc/overrides/madara/pawmanga/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/pawmanga/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/pawmanga/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..fa47aeac2a
Binary files /dev/null and b/multisrc/overrides/madara/pawmanga/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/pawmanga/res/web_hi_res_512.png b/multisrc/overrides/madara/pawmanga/res/web_hi_res_512.png
new file mode 100644
index 0000000000..72158ffb51
Binary files /dev/null and b/multisrc/overrides/madara/pawmanga/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/pawmanga/src/PawManga.kt b/multisrc/overrides/madara/pawmanga/src/PawManga.kt
new file mode 100644
index 0000000000..f82a6f9714
--- /dev/null
+++ b/multisrc/overrides/madara/pawmanga/src/PawManga.kt
@@ -0,0 +1,9 @@
+package eu.kanade.tachiyomi.extension.en.pawmanga
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+
+class PawManga : Madara("Paw Manga", "https://pawmanga.com", "en") {
+ override val useNewChapterEndpoint = true
+
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
+}
diff --git a/multisrc/overrides/madara/peachscan/src/PeachScan.kt b/multisrc/overrides/madara/peachscan/src/PeachScan.kt
deleted file mode 100644
index 85051217f8..0000000000
--- a/multisrc/overrides/madara/peachscan/src/PeachScan.kt
+++ /dev/null
@@ -1,22 +0,0 @@
-package eu.kanade.tachiyomi.extension.pt.peachscan
-
-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 PeachScan : Madara(
- "Peach Scan",
- "https://www.peachscan.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
-}
diff --git a/multisrc/overrides/madara/phoenixfansub/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/phoenixfansub/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index b6eec99d99..0000000000
Binary files a/multisrc/overrides/madara/phoenixfansub/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/phoenixfansub/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/phoenixfansub/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index d172832113..0000000000
Binary files a/multisrc/overrides/madara/phoenixfansub/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/phoenixfansub/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/phoenixfansub/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 2218cb154b..0000000000
Binary files a/multisrc/overrides/madara/phoenixfansub/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/phoenixfansub/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/phoenixfansub/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 769a3a6cf3..0000000000
Binary files a/multisrc/overrides/madara/phoenixfansub/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/phoenixfansub/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/phoenixfansub/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 1498827298..0000000000
Binary files a/multisrc/overrides/madara/phoenixfansub/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/phoenixfansub/res/web_hi_res_512.png b/multisrc/overrides/madara/phoenixfansub/res/web_hi_res_512.png
deleted file mode 100644
index 5ed840fb00..0000000000
Binary files a/multisrc/overrides/madara/phoenixfansub/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/madara/phoenixfansub/src/PhoenixFansub.kt b/multisrc/overrides/madara/phoenixfansub/src/PhoenixFansub.kt
deleted file mode 100644
index 0437b0b69a..0000000000
--- a/multisrc/overrides/madara/phoenixfansub/src/PhoenixFansub.kt
+++ /dev/null
@@ -1,16 +0,0 @@
-package eu.kanade.tachiyomi.extension.es.phoenixfansub
-
-import eu.kanade.tachiyomi.multisrc.madara.Madara
-import java.text.SimpleDateFormat
-import java.util.Locale
-
-class PhoenixFansub : Madara(
- "Phoenix Fansub",
- "https://phoenixmangas.com",
- "es",
- dateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale("es")),
-) {
- // Site moved from MangaThemesia to Madara
- override val versionId = 2
- override val useNewChapterEndpoint = true
-}
diff --git a/multisrc/overrides/madara/pikiranwibu/PikiranWibu.kt b/multisrc/overrides/madara/pikiranwibu/PikiranWibu.kt
new file mode 100644
index 0000000000..11119216cf
--- /dev/null
+++ b/multisrc/overrides/madara/pikiranwibu/PikiranWibu.kt
@@ -0,0 +1,20 @@
+package eu.kanade.tachiyomi.extension.id.pikiranwibu
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+import java.text.SimpleDateFormat
+import java.util.Locale
+
+class PikiranWibu : Madara(
+ "Pikiran Wibu",
+ "https://pikiran-wibu.com",
+ "id",
+ SimpleDateFormat("dd MMM yy", Locale("en")),
+) {
+
+ // popular is the latest
+ override val supportsLatest = false
+
+ override val filterNonMangaItems = false
+
+ override val mangaSubString = ""
+}
diff --git a/multisrc/overrides/madara/pikiranwibu/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/pikiranwibu/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..3d9886c003
Binary files /dev/null and b/multisrc/overrides/madara/pikiranwibu/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/pikiranwibu/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/pikiranwibu/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..3ad7fcdf22
Binary files /dev/null and b/multisrc/overrides/madara/pikiranwibu/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/pikiranwibu/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/pikiranwibu/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..6bef845770
Binary files /dev/null and b/multisrc/overrides/madara/pikiranwibu/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/pikiranwibu/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/pikiranwibu/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..1ad84e514a
Binary files /dev/null and b/multisrc/overrides/madara/pikiranwibu/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/pikiranwibu/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/pikiranwibu/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..a5dc99159d
Binary files /dev/null and b/multisrc/overrides/madara/pikiranwibu/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/pikiranwibu/res/web_hi_res_512.png b/multisrc/overrides/madara/pikiranwibu/res/web_hi_res_512.png
new file mode 100644
index 0000000000..b8e2b20a9f
Binary files /dev/null and b/multisrc/overrides/madara/pikiranwibu/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/mangathemesia/pmscans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/pmscans/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/mangathemesia/pmscans/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/madara/pmscans/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/mangathemesia/pmscans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/pmscans/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/mangathemesia/pmscans/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/madara/pmscans/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/mangathemesia/pmscans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/pmscans/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/mangathemesia/pmscans/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/madara/pmscans/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/mangathemesia/pmscans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/pmscans/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/mangathemesia/pmscans/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/madara/pmscans/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/mangathemesia/pmscans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/pmscans/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/mangathemesia/pmscans/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/madara/pmscans/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/mangathemesia/pmscans/res/web_hi_res_512.png b/multisrc/overrides/madara/pmscans/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/mangathemesia/pmscans/res/web_hi_res_512.png
rename to multisrc/overrides/madara/pmscans/res/web_hi_res_512.png
diff --git a/multisrc/overrides/madara/pmscans/src/PMScans.kt b/multisrc/overrides/madara/pmscans/src/PMScans.kt
new file mode 100644
index 0000000000..98969144e5
--- /dev/null
+++ b/multisrc/overrides/madara/pmscans/src/PMScans.kt
@@ -0,0 +1,17 @@
+package eu.kanade.tachiyomi.extension.en.pmscans
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+import java.text.SimpleDateFormat
+import java.util.Locale
+
+class PMScans : Madara(
+ "PMScans",
+ "https://rackusreads.com",
+ "en",
+ dateFormat = SimpleDateFormat("dd/MM/yyyy", Locale.ROOT),
+) {
+ override val versionId = 2
+ override val useNewChapterEndpoint = true
+
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
+}
diff --git a/multisrc/overrides/madara/pojokmanga/src/PojokManga.kt b/multisrc/overrides/madara/pojokmanga/src/PojokManga.kt
index 87d440a0c6..6cde6c452d 100644
--- a/multisrc/overrides/madara/pojokmanga/src/PojokManga.kt
+++ b/multisrc/overrides/madara/pojokmanga/src/PojokManga.kt
@@ -2,17 +2,26 @@ package eu.kanade.tachiyomi.extension.id.pojokmanga
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.Filter
import eu.kanade.tachiyomi.source.model.FilterList
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
+import okhttp3.OkHttpClient
import okhttp3.Request
import java.text.SimpleDateFormat
import java.util.Locale
+import java.util.concurrent.TimeUnit
class PojokManga : Madara("Pojok Manga", "https://pojokmanga.net", "id", SimpleDateFormat("MMM dd, yyyy", Locale.US)) {
+ override val client: OkHttpClient = super.client.newBuilder()
+ .rateLimit(20, 4, TimeUnit.SECONDS)
+ .build()
+
override val useNewChapterEndpoint = true
+ override val mangaSubString = "komik"
+
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
var url = "$baseUrl/${searchPage(page)}".toHttpUrlOrNull()!!.newBuilder()
url.addQueryParameter("s", query)
@@ -72,6 +81,8 @@ class PojokManga : Madara("Pojok Manga", "https://pojokmanga.net", "id", SimpleD
override fun searchMangaSelector() = "div.c-tabs-item__content, div.page-item-detail"
+ override val mangaDetailsSelectorTag = "#toNotBeUsed"
+
protected class ProjectFilter : UriPartFilter(
"Filter Project",
arrayOf(
diff --git a/multisrc/overrides/madara/ponymanga/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/ponymanga/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..5e9a385346
Binary files /dev/null and b/multisrc/overrides/madara/ponymanga/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/ponymanga/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/ponymanga/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..f594216ced
Binary files /dev/null and b/multisrc/overrides/madara/ponymanga/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/ponymanga/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/ponymanga/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..204a043d73
Binary files /dev/null and b/multisrc/overrides/madara/ponymanga/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/ponymanga/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/ponymanga/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..9b4a5c7062
Binary files /dev/null and b/multisrc/overrides/madara/ponymanga/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/ponymanga/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/ponymanga/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..8fa44a9ded
Binary files /dev/null and b/multisrc/overrides/madara/ponymanga/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/ponymanga/res/web_hi_res_512.png b/multisrc/overrides/madara/ponymanga/res/web_hi_res_512.png
new file mode 100644
index 0000000000..b86a13bad9
Binary files /dev/null and b/multisrc/overrides/madara/ponymanga/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/ponymanga/src/PonyManga.kt b/multisrc/overrides/madara/ponymanga/src/PonyManga.kt
new file mode 100644
index 0000000000..559b8df951
--- /dev/null
+++ b/multisrc/overrides/madara/ponymanga/src/PonyManga.kt
@@ -0,0 +1,9 @@
+package eu.kanade.tachiyomi.extension.en.ponymanga
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+
+class PonyManga : Madara("Pony Manga", "https://ponymanga.com", "en") {
+ override val useNewChapterEndpoint = false
+
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
+}
diff --git a/multisrc/overrides/madara/prismascans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/prismascans/res/mipmap-hdpi/ic_launcher.png
index 3b60a9651d..f2ce0ea2a7 100644
Binary files a/multisrc/overrides/madara/prismascans/res/mipmap-hdpi/ic_launcher.png and b/multisrc/overrides/madara/prismascans/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/prismascans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/prismascans/res/mipmap-mdpi/ic_launcher.png
index 8dbc777650..a095dfa386 100644
Binary files a/multisrc/overrides/madara/prismascans/res/mipmap-mdpi/ic_launcher.png and b/multisrc/overrides/madara/prismascans/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/prismascans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/prismascans/res/mipmap-xhdpi/ic_launcher.png
index 9701fd78ea..1673491c7a 100644
Binary files a/multisrc/overrides/madara/prismascans/res/mipmap-xhdpi/ic_launcher.png and b/multisrc/overrides/madara/prismascans/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/prismascans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/prismascans/res/mipmap-xxhdpi/ic_launcher.png
index f8efd0676a..dd419c46ce 100644
Binary files a/multisrc/overrides/madara/prismascans/res/mipmap-xxhdpi/ic_launcher.png and b/multisrc/overrides/madara/prismascans/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/prismascans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/prismascans/res/mipmap-xxxhdpi/ic_launcher.png
index f4a6538b57..f77543914b 100644
Binary files a/multisrc/overrides/madara/prismascans/res/mipmap-xxxhdpi/ic_launcher.png and b/multisrc/overrides/madara/prismascans/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/prismascans/res/web_hi_res_512.png b/multisrc/overrides/madara/prismascans/res/web_hi_res_512.png
index c7fcf3b161..f2042137e5 100644
Binary files a/multisrc/overrides/madara/prismascans/res/web_hi_res_512.png and b/multisrc/overrides/madara/prismascans/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/prismascans/src/DemonSect.kt b/multisrc/overrides/madara/prismascans/src/DemonSect.kt
new file mode 100644
index 0000000000..878d1f4a08
--- /dev/null
+++ b/multisrc/overrides/madara/prismascans/src/DemonSect.kt
@@ -0,0 +1,25 @@
+package eu.kanade.tachiyomi.extension.pt.prismascans
+
+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 DemonSect : Madara(
+ "Demon Sect",
+ "https://demonsect.com.br",
+ "pt-BR",
+ SimpleDateFormat("MMMMM dd, yyyy", Locale("pt", "BR")),
+) {
+
+ // Changed their name from Prisma Scans to Demon Sect.
+ override val id: Long = 8168108118738519332
+
+ override val client: OkHttpClient = super.client.newBuilder()
+ .rateLimit(1, 2, TimeUnit.SECONDS)
+ .build()
+
+ override val useNewChapterEndpoint = true
+}
diff --git a/multisrc/overrides/madara/prismascans/src/PrismaScans.kt b/multisrc/overrides/madara/prismascans/src/PrismaScans.kt
deleted file mode 100644
index 94e8c79556..0000000000
--- a/multisrc/overrides/madara/prismascans/src/PrismaScans.kt
+++ /dev/null
@@ -1,22 +0,0 @@
-package eu.kanade.tachiyomi.extension.pt.prismascans
-
-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 PrismaScans : Madara(
- "Prisma Scans",
- "https://prismascans.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()
-
- override val useNewChapterEndpoint = true
-}
diff --git a/multisrc/overrides/madara/randomscan/src/RandomScan.kt b/multisrc/overrides/madara/randomscan/src/RandomScan.kt
index 6fd07aaea1..dd72ddad59 100644
--- a/multisrc/overrides/madara/randomscan/src/RandomScan.kt
+++ b/multisrc/overrides/madara/randomscan/src/RandomScan.kt
@@ -9,12 +9,14 @@ import java.util.concurrent.TimeUnit
class RandomScan : Madara(
"Random Scan",
- "https://randomscans.com",
+ "https://randomscanlators.net",
"pt-BR",
- SimpleDateFormat("dd 'de' MMMM 'de' yyyy", Locale("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/readergen/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/readergen/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..46076aec52
Binary files /dev/null and b/multisrc/overrides/madara/readergen/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/readergen/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/readergen/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..bb77a4f8ca
Binary files /dev/null and b/multisrc/overrides/madara/readergen/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/readergen/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/readergen/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..26f49e502e
Binary files /dev/null and b/multisrc/overrides/madara/readergen/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/readergen/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/readergen/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..48a855d254
Binary files /dev/null and b/multisrc/overrides/madara/readergen/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/readergen/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/readergen/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..ecaf51d162
Binary files /dev/null and b/multisrc/overrides/madara/readergen/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/readergen/res/web_hi_res_512.png b/multisrc/overrides/madara/readergen/res/web_hi_res_512.png
new file mode 100644
index 0000000000..d79614b274
Binary files /dev/null and b/multisrc/overrides/madara/readergen/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/readergen/src/ReaderGen.kt b/multisrc/overrides/madara/readergen/src/ReaderGen.kt
new file mode 100644
index 0000000000..4127e93bf9
--- /dev/null
+++ b/multisrc/overrides/madara/readergen/src/ReaderGen.kt
@@ -0,0 +1,11 @@
+package eu.kanade.tachiyomi.extension.fr.readergen
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+import eu.kanade.tachiyomi.network.GET
+import okhttp3.Request
+
+class ReaderGen : Madara("ReaderGen", "https://fr.readergen.fr", "fr") {
+ override fun popularMangaRequest(page: Int): Request = GET("$baseUrl/page/$page/?s&post_type=wp-manga&m_orderby=views", headers)
+ override fun latestUpdatesRequest(page: Int): Request = GET("$baseUrl/page/$page/?s&post_type=wp-manga&m_orderby=latest", headers)
+ override fun popularMangaSelector() = searchMangaSelector()
+}
diff --git a/multisrc/overrides/madara/remangas/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/remangas/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index 1346a739fe..0000000000
Binary files a/multisrc/overrides/madara/remangas/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/remangas/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/remangas/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index 5c70036bbe..0000000000
Binary files a/multisrc/overrides/madara/remangas/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/remangas/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/remangas/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index e6644355f8..0000000000
Binary files a/multisrc/overrides/madara/remangas/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/remangas/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/remangas/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index ff09c37f1a..0000000000
Binary files a/multisrc/overrides/madara/remangas/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/remangas/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/remangas/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 09c8c51acb..0000000000
Binary files a/multisrc/overrides/madara/remangas/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/remangas/res/web_hi_res_512.png b/multisrc/overrides/madara/remangas/res/web_hi_res_512.png
deleted file mode 100644
index 586e6f610a..0000000000
Binary files a/multisrc/overrides/madara/remangas/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/madara/remangas/src/Remangas.kt b/multisrc/overrides/madara/remangas/src/Remangas.kt
deleted file mode 100644
index 3d4d10d4c8..0000000000
--- a/multisrc/overrides/madara/remangas/src/Remangas.kt
+++ /dev/null
@@ -1,20 +0,0 @@
-package eu.kanade.tachiyomi.extension.pt.remangas
-
-import eu.kanade.tachiyomi.multisrc.madara.Madara
-import okhttp3.OkHttpClient
-import java.text.SimpleDateFormat
-import java.util.Locale
-
-class Remangas : Madara(
- "Remangas",
- "https://remangas.net",
- "pt-BR",
- SimpleDateFormat("dd 'de' MMM 'de' yyy", Locale("pt", "BR")),
-) {
- override val versionId = 2
-
- override val useNewChapterEndpoint = true
-
- override val client: OkHttpClient = super.client.newBuilder()
- .build()
-}
diff --git a/multisrc/overrides/madara/rh2plusmanga/src/Rh2PlusManga.kt b/multisrc/overrides/madara/rh2plusmanga/src/Rh2PlusManga.kt
index 7970a9b5aa..baddef60e6 100644
--- a/multisrc/overrides/madara/rh2plusmanga/src/Rh2PlusManga.kt
+++ b/multisrc/overrides/madara/rh2plusmanga/src/Rh2PlusManga.kt
@@ -6,4 +6,6 @@ import java.util.Locale
class Rh2PlusManga : Madara("Rh2PlusManga", "https://www.rh2plusmanga.com", "th", SimpleDateFormat("d MMMM yyyy", Locale("th"))) {
override val filterNonMangaItems = false
+
+ override val pageListParseSelector = ".reading-content img"
}
diff --git a/multisrc/overrides/madara/richtoscan/src/RichtoScan.kt b/multisrc/overrides/madara/richtoscan/src/RichtoScan.kt
new file mode 100644
index 0000000000..904d2f9a4f
--- /dev/null
+++ b/multisrc/overrides/madara/richtoscan/src/RichtoScan.kt
@@ -0,0 +1,59 @@
+package eu.kanade.tachiyomi.extension.es.richtoscan
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+import eu.kanade.tachiyomi.network.POST
+import eu.kanade.tachiyomi.network.interceptor.rateLimit
+import okhttp3.FormBody
+import okhttp3.Request
+import java.text.SimpleDateFormat
+import java.util.Locale
+import java.util.concurrent.TimeUnit
+
+class RichtoScan : Madara(
+ "RichtoScan",
+ "https://richtoscan.com",
+ "es",
+ dateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale.ROOT),
+) {
+ override val client = super.client.newBuilder()
+ .rateLimit(2, 1, TimeUnit.SECONDS)
+ .build()
+
+ override val useNewChapterEndpoint = true
+
+ override fun popularMangaNextPageSelector() = "body:not(:has(.no-posts))"
+
+ private fun loadMoreRequest(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[order]", "desc")
+ 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 loadMoreRequest(page - 1, "_wp_manga_views")
+ }
+
+ override fun latestUpdatesRequest(page: Int): Request {
+ return loadMoreRequest(page - 1, "_latest_update")
+ }
+}
diff --git a/multisrc/overrides/madara/rightdarkscan/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/rightdarkscan/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..80bbe4c250
Binary files /dev/null and b/multisrc/overrides/madara/rightdarkscan/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/rightdarkscan/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/rightdarkscan/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..ebdff01657
Binary files /dev/null and b/multisrc/overrides/madara/rightdarkscan/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/rightdarkscan/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/rightdarkscan/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..a5e115d915
Binary files /dev/null and b/multisrc/overrides/madara/rightdarkscan/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/rightdarkscan/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/rightdarkscan/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..733a0120e2
Binary files /dev/null and b/multisrc/overrides/madara/rightdarkscan/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/rightdarkscan/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/rightdarkscan/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..a1784a3fd4
Binary files /dev/null and b/multisrc/overrides/madara/rightdarkscan/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/rightdarkscan/res/web_hi_res_512.png b/multisrc/overrides/madara/rightdarkscan/res/web_hi_res_512.png
new file mode 100644
index 0000000000..4e58fd4736
Binary files /dev/null and b/multisrc/overrides/madara/rightdarkscan/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/rightdarkscan/src/RightdarkScan.kt b/multisrc/overrides/madara/rightdarkscan/src/RightdarkScan.kt
new file mode 100644
index 0000000000..9037550801
--- /dev/null
+++ b/multisrc/overrides/madara/rightdarkscan/src/RightdarkScan.kt
@@ -0,0 +1,19 @@
+package eu.kanade.tachiyomi.extension.es.rightdarkscan
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+import eu.kanade.tachiyomi.network.interceptor.rateLimit
+import java.text.SimpleDateFormat
+import java.util.Locale
+
+class RightdarkScan : Madara(
+ "Rightdark Scan",
+ "https://rightdark-scan.com",
+ "es",
+ SimpleDateFormat("MMMM dd, yyyy", Locale("es")),
+) {
+ override val client = super.client.newBuilder()
+ .rateLimit(2, 1)
+ .build()
+
+ override val useNewChapterEndpoint = true
+}
diff --git a/multisrc/overrides/madara/rwbyscan/src/RwbyScan.kt b/multisrc/overrides/madara/rwbyscan/src/RwbyScan.kt
deleted file mode 100644
index c0b5fa91b0..0000000000
--- a/multisrc/overrides/madara/rwbyscan/src/RwbyScan.kt
+++ /dev/null
@@ -1,20 +0,0 @@
-package eu.kanade.tachiyomi.extension.pt.rwbyscan
-
-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 RwbyScan : Madara(
- "RWBY Scan",
- "https://rwbyscan.site",
- "pt-BR",
- SimpleDateFormat("dd/MM/yyyy", Locale("pt", "BR")),
-) {
-
- override val client: OkHttpClient = super.client.newBuilder()
- .rateLimit(1, 2, TimeUnit.SECONDS)
- .build()
-}
diff --git a/multisrc/overrides/madara/s2manga/src/S2Manga.kt b/multisrc/overrides/madara/s2manga/src/S2Manga.kt
new file mode 100644
index 0000000000..0179493181
--- /dev/null
+++ b/multisrc/overrides/madara/s2manga/src/S2Manga.kt
@@ -0,0 +1,11 @@
+package eu.kanade.tachiyomi.extension.en.s2manga
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+
+class S2Manga : Madara("S2Manga", "https://www.s2manga.com", "en") {
+
+ override fun headersBuilder() = super.headersBuilder()
+ .add("Referer", "$baseUrl/")
+
+ override val pageListParseSelector = "div.page-break img[src*=\"https\"]"
+}
diff --git a/multisrc/overrides/madara/samuraiscan/src/SamuraiScan.kt b/multisrc/overrides/madara/samuraiscan/src/SamuraiScan.kt
index a7a3081193..d08135f516 100644
--- a/multisrc/overrides/madara/samuraiscan/src/SamuraiScan.kt
+++ b/multisrc/overrides/madara/samuraiscan/src/SamuraiScan.kt
@@ -4,4 +4,14 @@ import eu.kanade.tachiyomi.multisrc.madara.Madara
import java.text.SimpleDateFormat
import java.util.Locale
-class SamuraiScan : Madara("SamuraiScan", "https://samuraiscan.com", "es", SimpleDateFormat("MMMM d, yyyy", Locale("es")))
+class SamuraiScan : Madara(
+ "SamuraiScan",
+ "https://samuraiscan.com",
+ "es",
+ SimpleDateFormat("MMMM d, yyyy", Locale("es")),
+) {
+ override val useNewChapterEndpoint = true
+
+ override val mangaDetailsSelectorDescription = "div.summary_content div.manga-summary"
+ override val mangaDetailsSelectorStatus = "div.summary_content div.manga-authors"
+}
diff --git a/multisrc/overrides/madara/scansraw/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/scansraw/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index cd8d4db487..0000000000
Binary files a/multisrc/overrides/madara/scansraw/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/scansraw/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/scansraw/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index aee571c1f5..0000000000
Binary files a/multisrc/overrides/madara/scansraw/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/scansraw/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/scansraw/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 6cb5781084..0000000000
Binary files a/multisrc/overrides/madara/scansraw/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/scansraw/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/scansraw/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 9dc4058e89..0000000000
Binary files a/multisrc/overrides/madara/scansraw/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/scansraw/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/scansraw/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 853b908744..0000000000
Binary files a/multisrc/overrides/madara/scansraw/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/scansraw/res/web_hi_res_512.png b/multisrc/overrides/madara/scansraw/res/web_hi_res_512.png
deleted file mode 100644
index 9db0a7a6dd..0000000000
Binary files a/multisrc/overrides/madara/scansraw/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/madara/scansraw/src/ScansRaw.kt b/multisrc/overrides/madara/scansraw/src/ScansRaw.kt
deleted file mode 100644
index b8d9a47419..0000000000
--- a/multisrc/overrides/madara/scansraw/src/ScansRaw.kt
+++ /dev/null
@@ -1,7 +0,0 @@
-package eu.kanade.tachiyomi.extension.en.scansraw
-
-import eu.kanade.tachiyomi.multisrc.madara.Madara
-
-class ScansRaw : Madara("Scans Raw", "https://scansraw.com", "en") {
- override val useNewChapterEndpoint: Boolean = true
-}
diff --git a/multisrc/overrides/madara/sensainayuri/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/sensainayuri/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index 68f6c16708..0000000000
Binary files a/multisrc/overrides/madara/sensainayuri/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/sensainayuri/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/sensainayuri/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index fd9546f059..0000000000
Binary files a/multisrc/overrides/madara/sensainayuri/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/sensainayuri/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/sensainayuri/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 65615a9d40..0000000000
Binary files a/multisrc/overrides/madara/sensainayuri/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/sensainayuri/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/sensainayuri/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 5fb86b9584..0000000000
Binary files a/multisrc/overrides/madara/sensainayuri/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/sensainayuri/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/sensainayuri/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 183d25fcd6..0000000000
Binary files a/multisrc/overrides/madara/sensainayuri/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/sensainayuri/res/web_hi_res_512.png b/multisrc/overrides/madara/sensainayuri/res/web_hi_res_512.png
deleted file mode 100644
index 630676d26d..0000000000
Binary files a/multisrc/overrides/madara/sensainayuri/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/madara/sensainayuri/src/SensainaYuri.kt b/multisrc/overrides/madara/sensainayuri/src/SensainaYuri.kt
deleted file mode 100644
index cc374ffe19..0000000000
--- a/multisrc/overrides/madara/sensainayuri/src/SensainaYuri.kt
+++ /dev/null
@@ -1,22 +0,0 @@
-package eu.kanade.tachiyomi.extension.pt.sensainayuri
-
-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 SensainaYuri : Madara(
- "Sensaina Yuri",
- "https://sensainayuri.dropescan.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/shadowtrad/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/shadowtrad/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..c751ecee60
Binary files /dev/null and b/multisrc/overrides/madara/shadowtrad/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/shadowtrad/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/shadowtrad/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..b87862687a
Binary files /dev/null and b/multisrc/overrides/madara/shadowtrad/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/shadowtrad/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/shadowtrad/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..55c42162ba
Binary files /dev/null and b/multisrc/overrides/madara/shadowtrad/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/shadowtrad/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/shadowtrad/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..7ccc160b0f
Binary files /dev/null and b/multisrc/overrides/madara/shadowtrad/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/shadowtrad/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/shadowtrad/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..26ada4639c
Binary files /dev/null and b/multisrc/overrides/madara/shadowtrad/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/shadowtrad/res/web_hi_res_512.png b/multisrc/overrides/madara/shadowtrad/res/web_hi_res_512.png
new file mode 100644
index 0000000000..a9e1b31ef5
Binary files /dev/null and b/multisrc/overrides/madara/shadowtrad/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/shadowtrad/src/Shadowtrad.kt b/multisrc/overrides/madara/shadowtrad/src/Shadowtrad.kt
new file mode 100644
index 0000000000..8a3250f318
--- /dev/null
+++ b/multisrc/overrides/madara/shadowtrad/src/Shadowtrad.kt
@@ -0,0 +1,12 @@
+package eu.kanade.tachiyomi.extension.fr.shadowtrad
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+import java.text.SimpleDateFormat
+import java.util.Locale
+
+class Shadowtrad : Madara("Shadowtrad", "https://shadowtrad.net", "fr", dateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale.FRANCE)) {
+ override val useNewChapterEndpoint = true
+ override val mangaDetailsSelectorAuthor = "div.manga-authors > a"
+ override val mangaDetailsSelectorDescription = "div.manga-summary > .description, div.manga-summary"
+ override val chapterUrlSuffix = ""
+}
diff --git a/multisrc/overrides/madara/shibamanga/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/shibamanga/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..ae815a305c
Binary files /dev/null and b/multisrc/overrides/madara/shibamanga/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/shibamanga/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/shibamanga/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..c98bb95076
Binary files /dev/null and b/multisrc/overrides/madara/shibamanga/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/shibamanga/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/shibamanga/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..6d5ce5e477
Binary files /dev/null and b/multisrc/overrides/madara/shibamanga/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/shibamanga/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/shibamanga/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..cb79d239f6
Binary files /dev/null and b/multisrc/overrides/madara/shibamanga/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/shibamanga/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/shibamanga/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..0be1e33a89
Binary files /dev/null and b/multisrc/overrides/madara/shibamanga/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/shibamanga/res/web_hi_res_512.png b/multisrc/overrides/madara/shibamanga/res/web_hi_res_512.png
new file mode 100644
index 0000000000..ddb05c2892
Binary files /dev/null and b/multisrc/overrides/madara/shibamanga/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/shibamanga/src/ShibaManga.kt b/multisrc/overrides/madara/shibamanga/src/ShibaManga.kt
new file mode 100644
index 0000000000..e37cf7b743
--- /dev/null
+++ b/multisrc/overrides/madara/shibamanga/src/ShibaManga.kt
@@ -0,0 +1,23 @@
+package eu.kanade.tachiyomi.extension.en.shibamanga
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+import java.text.SimpleDateFormat
+import java.util.Locale
+
+class ShibaManga : Madara(
+ "Shiba Manga",
+ "https://shibamanga.com",
+ "en",
+ SimpleDateFormat("MM/dd/yyyy", Locale.US),
+) {
+ override val filterNonMangaItems = false
+ override val useNewChapterEndpoint = true
+
+ override fun searchPage(page: Int): String {
+ return if (page > 1) {
+ "page/$page/"
+ } else {
+ ""
+ }
+ }
+}
diff --git a/multisrc/overrides/madara/shieldmanga/src/ShieldManga.kt b/multisrc/overrides/madara/shieldmanga/src/ShieldManga.kt
index 6aa6a9ef9b..e33716ae35 100644
--- a/multisrc/overrides/madara/shieldmanga/src/ShieldManga.kt
+++ b/multisrc/overrides/madara/shieldmanga/src/ShieldManga.kt
@@ -3,13 +3,10 @@ package eu.kanade.tachiyomi.extension.en.shieldmanga
import eu.kanade.tachiyomi.multisrc.madara.Madara
import eu.kanade.tachiyomi.network.interceptor.rateLimit
import okhttp3.OkHttpClient
-import java.util.concurrent.TimeUnit
class ShieldManga : Madara("Shield Manga", "https://shieldmanga.io", "en") {
- override val client: OkHttpClient = network.cloudflareClient.newBuilder()
- .connectTimeout(10, TimeUnit.SECONDS)
- .readTimeout(30, TimeUnit.SECONDS)
+ override val client: OkHttpClient = super.client.newBuilder()
.rateLimit(1)
.build()
diff --git a/multisrc/overrides/madara/shimadascans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/shimadascans/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index c30dac6777..0000000000
Binary files a/multisrc/overrides/madara/shimadascans/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/shimadascans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/shimadascans/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index be2885dd9e..0000000000
Binary files a/multisrc/overrides/madara/shimadascans/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/shimadascans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/shimadascans/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 586834e569..0000000000
Binary files a/multisrc/overrides/madara/shimadascans/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/shimadascans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/shimadascans/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 616d02f392..0000000000
Binary files a/multisrc/overrides/madara/shimadascans/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/shimadascans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/shimadascans/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 41ebb88b74..0000000000
Binary files a/multisrc/overrides/madara/shimadascans/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/shimadascans/res/web_hi_res_512.png b/multisrc/overrides/madara/shimadascans/res/web_hi_res_512.png
deleted file mode 100644
index 72046496d9..0000000000
Binary files a/multisrc/overrides/madara/shimadascans/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/madara/shimadascans/src/ShimadaScans.kt b/multisrc/overrides/madara/shimadascans/src/ShimadaScans.kt
deleted file mode 100644
index e3f10b1937..0000000000
--- a/multisrc/overrides/madara/shimadascans/src/ShimadaScans.kt
+++ /dev/null
@@ -1,9 +0,0 @@
-package eu.kanade.tachiyomi.extension.en.shimadascans
-
-import eu.kanade.tachiyomi.multisrc.madara.Madara
-import java.text.SimpleDateFormat
-import java.util.Locale
-
-class ShimadaScans : Madara("Shimada Scans", "https://shimadascans.com", "en", dateFormat = SimpleDateFormat("dd/MM/yyyy", Locale.ENGLISH)) {
- override val versionId = 2
-}
diff --git a/multisrc/overrides/madara/shinigami/src/Shinigami.kt b/multisrc/overrides/madara/shinigami/src/Shinigami.kt
index db53a74acb..1e3f2788b0 100644
--- a/multisrc/overrides/madara/shinigami/src/Shinigami.kt
+++ b/multisrc/overrides/madara/shinigami/src/Shinigami.kt
@@ -1,15 +1,41 @@
package eu.kanade.tachiyomi.extension.id.shinigami
import eu.kanade.tachiyomi.multisrc.madara.Madara
+import eu.kanade.tachiyomi.network.interceptor.rateLimit
import eu.kanade.tachiyomi.source.model.SChapter
-import okhttp3.HttpUrl.Companion.toHttpUrl
+import okhttp3.Headers
+import okhttp3.OkHttpClient
import org.jsoup.nodes.Element
+import java.util.concurrent.TimeUnit
+import kotlin.random.Random
-class Shinigami : Madara("Shinigami", "https://shinigami.id", "id") {
+class Shinigami : Madara("Shinigami", "https://shinigami.sh", "id") {
// moved from Reaper Scans (id) to Shinigami (id)
override val id = 3411809758861089969
- override val mangaSubString = "series"
+ override val client: OkHttpClient = super.client.newBuilder()
+ .rateLimit(4, 1, TimeUnit.SECONDS)
+ .build()
+
+ override fun headersBuilder(): Headers.Builder = super.headersBuilder()
+ .add("Sec-Fetch-Dest", "document")
+ .add("Sec-Fetch-Mode", "navigate")
+ .add("Sec-Fetch-Site", "same-origin")
+ .add("Upgrade-Insecure-Requests", "1")
+ .add("X-Requested-With", randomString)
+
+ private fun generateRandomString(length: Int): String {
+ val charset = "ABCDEFGHIJKLMNOPQRSTUVWXYZ.abcdefghijklmnopqrstuvwxyz.0123456789"
+ return (1..length)
+ .map { charset.random() }
+ .joinToString("")
+ }
+
+ private val randomLength = Random.Default.nextInt(13, 21)
+
+ private val randomString = generateRandomString(randomLength)
+
+ override val mangaSubString = "semua-series"
// Tags are useless as they are just SEO keywords.
override val mangaDetailsSelectorTag = ""
@@ -22,10 +48,7 @@ class Shinigami : Madara("Shinigami", "https://shinigami.id", "id") {
date_upload = urlElement.selectFirst("span.chapter-release-date > i")?.text()
.let { parseChapterDate(it) }
- val fixedUrl = urlElement.attr("abs:href").toHttpUrl().newBuilder()
- .removeAllQueryParameters("style")
- .addQueryParameter("style", "list")
- .toString()
+ val fixedUrl = urlElement.attr("abs:href")
setUrlWithoutDomain(fixedUrl)
}
diff --git a/multisrc/overrides/madara/shiraiscans/src/ShiraiScans.kt b/multisrc/overrides/madara/shiraiscans/src/ShiraiScans.kt
deleted file mode 100644
index 6c03d38774..0000000000
--- a/multisrc/overrides/madara/shiraiscans/src/ShiraiScans.kt
+++ /dev/null
@@ -1,22 +0,0 @@
-package eu.kanade.tachiyomi.extension.pt.shiraiscans
-
-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 ShiraiScans : Madara(
- "Shirai Scans",
- "https://shiraiscans.com.br",
- "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/sinensis/src/SinensisScan.kt b/multisrc/overrides/madara/sinensis/src/SinensisScan.kt
index b5b697f43d..26174475ef 100644
--- a/multisrc/overrides/madara/sinensis/src/SinensisScan.kt
+++ b/multisrc/overrides/madara/sinensis/src/SinensisScan.kt
@@ -13,7 +13,7 @@ import java.util.concurrent.TimeUnit
class SinensisScan : Madara(
"Sinensis Scan",
- "https://sinensisscans.com",
+ "https://sinensisscan.net",
"pt-BR",
SimpleDateFormat("dd/MM/yyyy", Locale("pt", "BR")),
) {
diff --git a/multisrc/overrides/madara/sleepingknightscans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/sleepingknightscans/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index d8fd84c84f..0000000000
Binary files a/multisrc/overrides/madara/sleepingknightscans/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/sleepingknightscans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/sleepingknightscans/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index 75146c2e39..0000000000
Binary files a/multisrc/overrides/madara/sleepingknightscans/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/sleepingknightscans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/sleepingknightscans/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 5d3544d05d..0000000000
Binary files a/multisrc/overrides/madara/sleepingknightscans/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/sleepingknightscans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/sleepingknightscans/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 67494f5b9d..0000000000
Binary files a/multisrc/overrides/madara/sleepingknightscans/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/sleepingknightscans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/sleepingknightscans/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 4a08843952..0000000000
Binary files a/multisrc/overrides/madara/sleepingknightscans/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/sleepingknightscans/res/web_hi_res_512.png b/multisrc/overrides/madara/sleepingknightscans/res/web_hi_res_512.png
deleted file mode 100644
index 586c2dc869..0000000000
Binary files a/multisrc/overrides/madara/sleepingknightscans/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/madara/sodascan/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/sodascan/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index ac0ed378e5..0000000000
Binary files a/multisrc/overrides/madara/sodascan/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/sodascan/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/sodascan/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index 572562aa8f..0000000000
Binary files a/multisrc/overrides/madara/sodascan/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/sodascan/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/sodascan/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 141ece0e28..0000000000
Binary files a/multisrc/overrides/madara/sodascan/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/sodascan/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/sodascan/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 1d55a099ea..0000000000
Binary files a/multisrc/overrides/madara/sodascan/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/sodascan/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/sodascan/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 5a72d8304c..0000000000
Binary files a/multisrc/overrides/madara/sodascan/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/sodascan/res/web_hi_res_512.png b/multisrc/overrides/madara/sodascan/res/web_hi_res_512.png
deleted file mode 100644
index 38c16efe91..0000000000
Binary files a/multisrc/overrides/madara/sodascan/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/madara/sodascan/src/SodaScan.kt b/multisrc/overrides/madara/sodascan/src/SodaScan.kt
deleted file mode 100644
index ceb6b370f0..0000000000
--- a/multisrc/overrides/madara/sodascan/src/SodaScan.kt
+++ /dev/null
@@ -1,20 +0,0 @@
-package eu.kanade.tachiyomi.extension.pt.sodascan
-
-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 SodaScan : Madara(
- "SodaScan",
- "https://sodascan.xyz",
- "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/sweetdesirescan/src/SweetDesireScan.kt b/multisrc/overrides/madara/sweetdesirescan/src/SweetDesireScan.kt
deleted file mode 100644
index d5bff18edb..0000000000
--- a/multisrc/overrides/madara/sweetdesirescan/src/SweetDesireScan.kt
+++ /dev/null
@@ -1,22 +0,0 @@
-package eu.kanade.tachiyomi.extension.pt.sweetdesirescan
-
-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 SweetDesireScan : Madara(
- "Sweet Desire Scan",
- "https://sweetdesire.com.br",
- "pt-BR",
- SimpleDateFormat("MMMMM dd, yyyy", Locale("pt", "BR")),
-) {
-
- override val client: OkHttpClient = super.client.newBuilder()
- .rateLimit(1, 3, TimeUnit.SECONDS)
- .build()
-
- override val useNewChapterEndpoint = true
-}
diff --git a/multisrc/overrides/madara/taberumangas/src/TaberuMangas.kt b/multisrc/overrides/madara/taberumangas/src/TaberuMangas.kt
new file mode 100644
index 0000000000..ae5e4232ae
--- /dev/null
+++ b/multisrc/overrides/madara/taberumangas/src/TaberuMangas.kt
@@ -0,0 +1,22 @@
+package eu.kanade.tachiyomi.extension.pt.taberumangas
+
+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 TaberuMangas : Madara(
+ "Taberu Mangás",
+ "https://taberu.org",
+ "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/taurusfansub/src/TaurusFansub.kt b/multisrc/overrides/madara/taurusfansub/src/TaurusFansub.kt
index b4a38e8783..aeb7b69283 100644
--- a/multisrc/overrides/madara/taurusfansub/src/TaurusFansub.kt
+++ b/multisrc/overrides/madara/taurusfansub/src/TaurusFansub.kt
@@ -1,14 +1,60 @@
package eu.kanade.tachiyomi.extension.es.taurusfansub
import eu.kanade.tachiyomi.multisrc.madara.Madara
+import eu.kanade.tachiyomi.network.POST
+import eu.kanade.tachiyomi.network.interceptor.rateLimit
+import okhttp3.FormBody
+import okhttp3.Request
import java.text.SimpleDateFormat
import java.util.Locale
+import java.util.concurrent.TimeUnit
class TaurusFansub : Madara(
"Taurus Fansub",
- "https://taurusfansub.com",
+ "https://taurusmanga.com",
"es",
dateFormat = SimpleDateFormat("dd/MM/yyy", Locale.ROOT),
) {
+ override val client = super.client.newBuilder()
+ .rateLimit(2, 1, TimeUnit.SECONDS)
+ .build()
+
override val useNewChapterEndpoint = true
+
+ override fun popularMangaNextPageSelector() = "body:not(:has(.no-posts))"
+ override val mangaDetailsSelectorDescription = "div.tab-summary > div.tab-content > div#tab-reducir > div.contenedor"
+
+ private fun loadMoreRequest(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[order]", "desc")
+ add("vars[meta_query][relation]", "OR")
+ add("vars[manga_archives_item_layout]", "big_thumbnail")
+ }.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 loadMoreRequest(page - 1, "_wp_manga_views")
+ }
+
+ override fun latestUpdatesRequest(page: Int): Request {
+ return loadMoreRequest(page - 1, "_latest_update")
+ }
}
diff --git a/multisrc/overrides/madara/tecnoscan/src/TecnoScan.kt b/multisrc/overrides/madara/tecnoscan/src/TecnoScan.kt
deleted file mode 100644
index be1f4b983e..0000000000
--- a/multisrc/overrides/madara/tecnoscan/src/TecnoScan.kt
+++ /dev/null
@@ -1,16 +0,0 @@
-package eu.kanade.tachiyomi.extension.es.tecnoscan
-
-import eu.kanade.tachiyomi.multisrc.madara.Madara
-import java.text.SimpleDateFormat
-import java.util.Locale
-
-class TecnoScan : Madara(
- "Tecno Scan",
- "https://tecnoscann.com",
- "es",
- dateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale("es")),
-) {
- // Site moved from MangaThemesia to Madara
- override val versionId = 2
- override val useNewChapterEndpoint = true
-}
diff --git a/multisrc/overrides/madara/teenmanhua/src/TeenManhua.kt b/multisrc/overrides/madara/teenmanhua/src/TeenManhua.kt
index 49ee684078..b010c54ee4 100644
--- a/multisrc/overrides/madara/teenmanhua/src/TeenManhua.kt
+++ b/multisrc/overrides/madara/teenmanhua/src/TeenManhua.kt
@@ -9,4 +9,6 @@ class TeenManhua : Madara(
"https://teenmanhua.com",
"en",
dateFormat = SimpleDateFormat("dd/MM/yy", Locale.US),
-)
+) {
+ override val filterNonMangaItems = false
+}
diff --git a/multisrc/overrides/madara/templescan/src/TempleScan.kt b/multisrc/overrides/madara/templescan/src/TempleScan.kt
deleted file mode 100644
index a7537980af..0000000000
--- a/multisrc/overrides/madara/templescan/src/TempleScan.kt
+++ /dev/null
@@ -1,47 +0,0 @@
-package eu.kanade.tachiyomi.extension.en.templescan
-
-import eu.kanade.tachiyomi.multisrc.madara.Madara
-import eu.kanade.tachiyomi.network.interceptor.rateLimit
-import eu.kanade.tachiyomi.source.model.SChapter
-import eu.kanade.tachiyomi.source.model.SManga
-import okhttp3.OkHttpClient
-import org.jsoup.nodes.Element
-import java.text.SimpleDateFormat
-import java.util.Locale
-
-class TempleScan : Madara(
- "Temple Scan",
- "https://templescan.net",
- "en",
- SimpleDateFormat("dd.MM.yyyy", Locale.ENGLISH),
-) {
- override val mangaSubString = "comic"
- override val useNewChapterEndpoint = true
- override fun popularMangaSelector() = "div.c-tabs-item > div > div"
- override val popularMangaUrlSelector = "div.series-box a"
- override val mangaDetailsSelectorStatus = ".post-content_item:contains(Status) .summary-content"
-
- override val client: OkHttpClient = super.client.newBuilder()
- .rateLimit(1)
- .build()
-
- override fun popularMangaFromElement(element: Element): SManga {
- return super.popularMangaFromElement(element).apply {
- title = element.select(popularMangaUrlSelector).text()
- }
- }
-
- 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.select(".chapter-manhwa-title").text()
- }
- }
-}
diff --git a/multisrc/overrides/madara/theblank/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/theblank/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..88c253755d
Binary files /dev/null and b/multisrc/overrides/madara/theblank/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/theblank/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/theblank/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..4c10fb3402
Binary files /dev/null and b/multisrc/overrides/madara/theblank/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/theblank/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/theblank/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..1810a81fc2
Binary files /dev/null and b/multisrc/overrides/madara/theblank/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/theblank/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/theblank/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..a57fc1069b
Binary files /dev/null and b/multisrc/overrides/madara/theblank/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/theblank/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/theblank/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..a2765f05cb
Binary files /dev/null and b/multisrc/overrides/madara/theblank/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/theblank/res/web_hi_res_512.png b/multisrc/overrides/madara/theblank/res/web_hi_res_512.png
new file mode 100644
index 0000000000..7df497287a
Binary files /dev/null and b/multisrc/overrides/madara/theblank/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/theblank/src/TheBlank.kt b/multisrc/overrides/madara/theblank/src/TheBlank.kt
new file mode 100644
index 0000000000..a28fb40754
--- /dev/null
+++ b/multisrc/overrides/madara/theblank/src/TheBlank.kt
@@ -0,0 +1,47 @@
+package eu.kanade.tachiyomi.extension.en.theblank
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+import eu.kanade.tachiyomi.network.interceptor.rateLimit
+import eu.kanade.tachiyomi.source.model.MangasPage
+import okhttp3.Response
+import java.text.SimpleDateFormat
+import java.util.Locale
+
+class TheBlank : Madara(
+ "The Blank Scanlation",
+ "https://theblank.net",
+ "en",
+ dateFormat = SimpleDateFormat("dd/MM/yy", Locale.US),
+) {
+
+ override val client = super.client.newBuilder()
+ .rateLimit(1)
+ .build()
+
+ override val useNewChapterEndpoint = true
+
+ override fun searchPage(page: Int): String {
+ return if (page > 1) {
+ "page/$page/"
+ } else {
+ ""
+ }
+ }
+
+ override fun popularMangaParse(response: Response) =
+ super.popularMangaParse(response).fixNextPage()
+
+ override fun latestUpdatesParse(response: Response) =
+ super.latestUpdatesParse(response).fixNextPage()
+
+ override fun searchMangaParse(response: Response) =
+ super.searchMangaParse(response).fixNextPage()
+
+ private fun MangasPage.fixNextPage(): MangasPage {
+ return if (mangas.size < 12) {
+ MangasPage(mangas, false)
+ } else {
+ this
+ }
+ }
+}
diff --git a/multisrc/overrides/madara/thesugar/src/TheSugar.kt b/multisrc/overrides/madara/thesugar/src/TheSugar.kt
deleted file mode 100644
index e233ab3672..0000000000
--- a/multisrc/overrides/madara/thesugar/src/TheSugar.kt
+++ /dev/null
@@ -1,22 +0,0 @@
-package eu.kanade.tachiyomi.extension.pt.thesugar
-
-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 TheSugar : Madara(
- "The Sugar",
- "https://thesugarscan.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/threequeensscanlator/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/threequeensscanlator/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index 4970c44c4d..0000000000
Binary files a/multisrc/overrides/madara/threequeensscanlator/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/threequeensscanlator/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/threequeensscanlator/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index be647813f4..0000000000
Binary files a/multisrc/overrides/madara/threequeensscanlator/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/threequeensscanlator/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/threequeensscanlator/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 3d07e88274..0000000000
Binary files a/multisrc/overrides/madara/threequeensscanlator/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/threequeensscanlator/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/threequeensscanlator/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 671de7d7a7..0000000000
Binary files a/multisrc/overrides/madara/threequeensscanlator/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/threequeensscanlator/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/threequeensscanlator/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 7448561607..0000000000
Binary files a/multisrc/overrides/madara/threequeensscanlator/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/threequeensscanlator/res/web_hi_res_512.png b/multisrc/overrides/madara/threequeensscanlator/res/web_hi_res_512.png
deleted file mode 100644
index b0992b3cf2..0000000000
Binary files a/multisrc/overrides/madara/threequeensscanlator/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/madara/threequeensscanlator/src/ThreeQueensScanlator.kt b/multisrc/overrides/madara/threequeensscanlator/src/ThreeQueensScanlator.kt
deleted file mode 100644
index a211c93b15..0000000000
--- a/multisrc/overrides/madara/threequeensscanlator/src/ThreeQueensScanlator.kt
+++ /dev/null
@@ -1,20 +0,0 @@
-package eu.kanade.tachiyomi.extension.pt.threequeensscanlator
-
-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 ThreeQueensScanlator : Madara(
- "Three Queens Scanlator",
- "https://tqscan.com.br",
- "pt-BR",
- SimpleDateFormat("dd 'de' MMMM 'de' yyyy", Locale("pt", "BR")),
-) {
-
- override val client: OkHttpClient = super.client.newBuilder()
- .rateLimit(1, 2, TimeUnit.SECONDS)
- .build()
-}
diff --git a/multisrc/overrides/madara/toongod/src/ToonGod.kt b/multisrc/overrides/madara/toongod/src/ToonGod.kt
index 54a6d271fa..9f8bbb4099 100644
--- a/multisrc/overrides/madara/toongod/src/ToonGod.kt
+++ b/multisrc/overrides/madara/toongod/src/ToonGod.kt
@@ -1,17 +1,12 @@
package eu.kanade.tachiyomi.extension.en.toongod
import eu.kanade.tachiyomi.multisrc.madara.Madara
-import eu.kanade.tachiyomi.network.GET
-import eu.kanade.tachiyomi.source.model.Page
-import okhttp3.Request
import java.text.SimpleDateFormat
import java.util.Locale
-class ToonGod : Madara("ToonGod", "https://www.toongod.com", "en", SimpleDateFormat("dd MMM yyyy", Locale.US)) {
- override fun popularMangaRequest(page: Int): Request = GET("$baseUrl/webtoons/page/$page/?m_orderby=views", headers)
- override fun latestUpdatesRequest(page: Int): Request = GET("$baseUrl/webtoons/page/$page/?m_orderby=latest", headers)
+class ToonGod : Madara("ToonGod", "https://www.toongod.org", "en", SimpleDateFormat("d MMM yyyy", Locale.US)) {
override val mangaSubString = "webtoons"
- override fun imageRequest(page: Page): Request {
- return GET(page.imageUrl!!, headers)
- }
+ override val useNewChapterEndpoint = false
+
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
}
diff --git a/multisrc/overrides/madara/toonizy/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/toonizy/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..85890f979a
Binary files /dev/null and b/multisrc/overrides/madara/toonizy/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/toonizy/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/toonizy/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..c78e313f04
Binary files /dev/null and b/multisrc/overrides/madara/toonizy/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/toonizy/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/toonizy/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..2d21e7e900
Binary files /dev/null and b/multisrc/overrides/madara/toonizy/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/toonizy/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/toonizy/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..edcac38ca9
Binary files /dev/null and b/multisrc/overrides/madara/toonizy/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/toonizy/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/toonizy/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..9c722cb0ee
Binary files /dev/null and b/multisrc/overrides/madara/toonizy/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/toonizy/res/web_hi_res_512.png b/multisrc/overrides/madara/toonizy/res/web_hi_res_512.png
new file mode 100644
index 0000000000..c378308af6
Binary files /dev/null and b/multisrc/overrides/madara/toonizy/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/toonizy/src/Toonizy.kt b/multisrc/overrides/madara/toonizy/src/Toonizy.kt
new file mode 100644
index 0000000000..fce888281e
--- /dev/null
+++ b/multisrc/overrides/madara/toonizy/src/Toonizy.kt
@@ -0,0 +1,16 @@
+package eu.kanade.tachiyomi.extension.en.toonizy
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+import java.text.SimpleDateFormat
+import java.util.Locale
+
+class Toonizy : Madara(
+ "Toonizy",
+ "https://toonizy.com",
+ "en",
+ dateFormat = SimpleDateFormat("MMM d, yy", Locale.ENGLISH),
+) {
+ override val useNewChapterEndpoint = true
+
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
+}
diff --git a/multisrc/overrides/madara/topmanhua/src/TopManhua.kt b/multisrc/overrides/madara/topmanhua/src/TopManhua.kt
index c27d6e19c9..4a8b4a3663 100644
--- a/multisrc/overrides/madara/topmanhua/src/TopManhua.kt
+++ b/multisrc/overrides/madara/topmanhua/src/TopManhua.kt
@@ -1,13 +1,10 @@
package eu.kanade.tachiyomi.extension.en.topmanhua
import eu.kanade.tachiyomi.multisrc.madara.Madara
-import okhttp3.Headers
import java.text.SimpleDateFormat
import java.util.Locale
class TopManhua : Madara("Top Manhua", "https://topmanhua.com", "en", SimpleDateFormat("MM/dd/yy", Locale.US)) {
- override fun headersBuilder(): Headers.Builder = super.headersBuilder().add("Referer", baseUrl)
-
// The website does not flag the content.
override val filterNonMangaItems = false
}
diff --git a/multisrc/overrides/madara/traduccionesmoonlight/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/traduccionesmoonlight/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..08728fdd4e
Binary files /dev/null and b/multisrc/overrides/madara/traduccionesmoonlight/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/traduccionesmoonlight/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/traduccionesmoonlight/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..c14c3fc3ea
Binary files /dev/null and b/multisrc/overrides/madara/traduccionesmoonlight/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/traduccionesmoonlight/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/traduccionesmoonlight/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..75c19dac29
Binary files /dev/null and b/multisrc/overrides/madara/traduccionesmoonlight/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/traduccionesmoonlight/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/traduccionesmoonlight/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..ffd3932795
Binary files /dev/null and b/multisrc/overrides/madara/traduccionesmoonlight/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/traduccionesmoonlight/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/traduccionesmoonlight/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..d661e5611f
Binary files /dev/null and b/multisrc/overrides/madara/traduccionesmoonlight/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/traduccionesmoonlight/res/web_hi_res_512.png b/multisrc/overrides/madara/traduccionesmoonlight/res/web_hi_res_512.png
new file mode 100644
index 0000000000..bdfc28d88a
Binary files /dev/null and b/multisrc/overrides/madara/traduccionesmoonlight/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/traduccionesmoonlight/src/TraduccionesMoonlight.kt b/multisrc/overrides/madara/traduccionesmoonlight/src/TraduccionesMoonlight.kt
new file mode 100644
index 0000000000..6d20405564
--- /dev/null
+++ b/multisrc/overrides/madara/traduccionesmoonlight/src/TraduccionesMoonlight.kt
@@ -0,0 +1,14 @@
+package eu.kanade.tachiyomi.extension.es.traduccionesmoonlight
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+import java.text.SimpleDateFormat
+import java.util.Locale
+
+class TraduccionesMoonlight : Madara(
+ "Traducciones Moonlight",
+ "https://traduccionesmoonlight.com",
+ "es",
+ SimpleDateFormat("dd 'de' MMMM 'de' yyyy", Locale("es")),
+) {
+ override val useNewChapterEndpoint = true
+}
diff --git a/multisrc/overrides/madara/trapscans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/trapscans/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index 31170ff21c..0000000000
Binary files a/multisrc/overrides/madara/trapscans/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/trapscans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/trapscans/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index a18873c8c8..0000000000
Binary files a/multisrc/overrides/madara/trapscans/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/trapscans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/trapscans/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 65e67f049d..0000000000
Binary files a/multisrc/overrides/madara/trapscans/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/trapscans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/trapscans/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 06e893ab23..0000000000
Binary files a/multisrc/overrides/madara/trapscans/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/trapscans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/trapscans/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 5cbd28b4ac..0000000000
Binary files a/multisrc/overrides/madara/trapscans/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/trapscans/res/web_hi_res_512.png b/multisrc/overrides/madara/trapscans/res/web_hi_res_512.png
deleted file mode 100644
index 54599cf1f6..0000000000
Binary files a/multisrc/overrides/madara/trapscans/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/madara/trapscans/src/TrapScans.kt b/multisrc/overrides/madara/trapscans/src/TrapScans.kt
deleted file mode 100644
index 144657062d..0000000000
--- a/multisrc/overrides/madara/trapscans/src/TrapScans.kt
+++ /dev/null
@@ -1,8 +0,0 @@
-package eu.kanade.tachiyomi.extension.en.trapscans
-
-import eu.kanade.tachiyomi.multisrc.madara.Madara
-
-class TrapScans : Madara("Trap Scans", "https://trapscans.com", "en") {
-
- override val mangaDetailsSelectorDescription = ".description-summary p"
-}
diff --git a/multisrc/overrides/madara/tudoquadrinhos/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/tudoquadrinhos/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index 8e167e74b7..0000000000
Binary files a/multisrc/overrides/madara/tudoquadrinhos/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/tudoquadrinhos/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/tudoquadrinhos/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index e1e9fd3479..0000000000
Binary files a/multisrc/overrides/madara/tudoquadrinhos/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/tudoquadrinhos/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/tudoquadrinhos/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 75e15f740e..0000000000
Binary files a/multisrc/overrides/madara/tudoquadrinhos/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/tudoquadrinhos/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/tudoquadrinhos/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 120c9864a6..0000000000
Binary files a/multisrc/overrides/madara/tudoquadrinhos/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/tudoquadrinhos/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/tudoquadrinhos/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 42e557dfa9..0000000000
Binary files a/multisrc/overrides/madara/tudoquadrinhos/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/tudoquadrinhos/res/web_hi_res_512.png b/multisrc/overrides/madara/tudoquadrinhos/res/web_hi_res_512.png
deleted file mode 100644
index 8318e2f8d3..0000000000
Binary files a/multisrc/overrides/madara/tudoquadrinhos/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/madara/tudoquadrinhos/src/TudoQuadrinhos.kt b/multisrc/overrides/madara/tudoquadrinhos/src/TudoQuadrinhos.kt
deleted file mode 100644
index 3d7541bda4..0000000000
--- a/multisrc/overrides/madara/tudoquadrinhos/src/TudoQuadrinhos.kt
+++ /dev/null
@@ -1,23 +0,0 @@
-package eu.kanade.tachiyomi.extension.pt.tudoquadrinhos
-
-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 TudoQuadrinhos : Madara(
- "Tudo Quadrinhos",
- "https://tudoquadrinhos.com.br",
- "pt-BR",
- SimpleDateFormat("dd/MM/yyyy", Locale("pt", "BR")),
-) {
-
- override val client: OkHttpClient = super.client.newBuilder()
- .rateLimit(1, 2, TimeUnit.SECONDS)
- .build()
-
- // The tags are just SEO keywords.
- override val mangaDetailsSelectorTag: String = ""
-}
diff --git a/multisrc/overrides/madara/turkcemanga/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/turkcemanga/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index 667b137ec1..0000000000
Binary files a/multisrc/overrides/madara/turkcemanga/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/turkcemanga/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/turkcemanga/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index 5c5c1894bd..0000000000
Binary files a/multisrc/overrides/madara/turkcemanga/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/turkcemanga/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/turkcemanga/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 5ae5a8f1e6..0000000000
Binary files a/multisrc/overrides/madara/turkcemanga/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/turkcemanga/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/turkcemanga/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 519a65c6c9..0000000000
Binary files a/multisrc/overrides/madara/turkcemanga/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/turkcemanga/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/turkcemanga/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 4733f566ef..0000000000
Binary files a/multisrc/overrides/madara/turkcemanga/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/turkcemanga/res/web_hi_res_512.png b/multisrc/overrides/madara/turkcemanga/res/web_hi_res_512.png
deleted file mode 100644
index 17ce9c54c9..0000000000
Binary files a/multisrc/overrides/madara/turkcemanga/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/madara/turkcemanga/src/TurkceManga.kt b/multisrc/overrides/madara/turkcemanga/src/TurkceManga.kt
deleted file mode 100644
index 1d0714960a..0000000000
--- a/multisrc/overrides/madara/turkcemanga/src/TurkceManga.kt
+++ /dev/null
@@ -1,16 +0,0 @@
-package eu.kanade.tachiyomi.extension.tr.turkcemanga
-
-import eu.kanade.tachiyomi.multisrc.madara.Madara
-import eu.kanade.tachiyomi.network.GET
-import eu.kanade.tachiyomi.source.model.SManga
-import okhttp3.Request
-import org.jsoup.nodes.Element
-
-class TurkceManga : Madara("Türkçe Manga", "https://turkcemanga.com", "tr") {
- override fun popularMangaRequest(page: Int): Request = GET("$baseUrl/page/$page/?s&post_type=wp-manga&m_orderby=views", headers)
- override fun popularMangaSelector() = searchMangaSelector()
- override fun popularMangaFromElement(element: Element): SManga = searchMangaFromElement(element)
- override fun latestUpdatesRequest(page: Int): Request = GET("$baseUrl/page/$page/?s&post_type=wp-manga&m_orderby=latest", headers)
- override fun latestUpdatesSelector() = searchMangaSelector()
- override fun latestUpdatesFromElement(element: Element): SManga = searchMangaFromElement(element)
-}
diff --git a/multisrc/overrides/madara/unitoon/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/unitoon/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..289df82873
Binary files /dev/null and b/multisrc/overrides/madara/unitoon/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/unitoon/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/unitoon/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..3769279907
Binary files /dev/null and b/multisrc/overrides/madara/unitoon/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/unitoon/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/unitoon/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..f63ace60c3
Binary files /dev/null and b/multisrc/overrides/madara/unitoon/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/unitoon/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/unitoon/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..7d1709c7fa
Binary files /dev/null and b/multisrc/overrides/madara/unitoon/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/unitoon/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/unitoon/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..ce25768b1b
Binary files /dev/null and b/multisrc/overrides/madara/unitoon/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/unitoon/res/web_hi_res_512.png b/multisrc/overrides/madara/unitoon/res/web_hi_res_512.png
new file mode 100644
index 0000000000..262c279157
Binary files /dev/null and b/multisrc/overrides/madara/unitoon/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/unitoon/src/Unitoon.kt b/multisrc/overrides/madara/unitoon/src/Unitoon.kt
new file mode 100644
index 0000000000..4f6c3fb279
--- /dev/null
+++ b/multisrc/overrides/madara/unitoon/src/Unitoon.kt
@@ -0,0 +1,19 @@
+package eu.kanade.tachiyomi.extension.es.unitoon
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+import eu.kanade.tachiyomi.network.interceptor.rateLimit
+import java.text.SimpleDateFormat
+import java.util.Locale
+
+class Unitoon : Madara(
+ "Unitoon",
+ "https://lectorunitoon.com",
+ "es",
+ SimpleDateFormat("dd/MM/yyyy", Locale("es")),
+) {
+ override val client = super.client.newBuilder()
+ .rateLimit(2, 1)
+ .build()
+
+ override val useNewChapterEndpoint = true
+}
diff --git a/multisrc/overrides/madara/unitoonoficial/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/unitoonoficial/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..9197367c76
Binary files /dev/null and b/multisrc/overrides/madara/unitoonoficial/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/unitoonoficial/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/unitoonoficial/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..6fb6d41030
Binary files /dev/null and b/multisrc/overrides/madara/unitoonoficial/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/unitoonoficial/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/unitoonoficial/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..0d1d4ac36a
Binary files /dev/null and b/multisrc/overrides/madara/unitoonoficial/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/unitoonoficial/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/unitoonoficial/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..21a2f11b0a
Binary files /dev/null and b/multisrc/overrides/madara/unitoonoficial/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/unitoonoficial/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/unitoonoficial/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..35cd506f51
Binary files /dev/null and b/multisrc/overrides/madara/unitoonoficial/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/unitoonoficial/res/web_hi_res_512.png b/multisrc/overrides/madara/unitoonoficial/res/web_hi_res_512.png
new file mode 100644
index 0000000000..7bde7ec0e0
Binary files /dev/null and b/multisrc/overrides/madara/unitoonoficial/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/unitoonoficial/src/UnitoonOficial.kt b/multisrc/overrides/madara/unitoonoficial/src/UnitoonOficial.kt
new file mode 100644
index 0000000000..428f4f1c3c
--- /dev/null
+++ b/multisrc/overrides/madara/unitoonoficial/src/UnitoonOficial.kt
@@ -0,0 +1,14 @@
+package eu.kanade.tachiyomi.extension.es.unitoonoficial
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+import java.text.SimpleDateFormat
+import java.util.Locale
+
+class UnitoonOficial : Madara(
+ "Unitoon Oficial",
+ "https://unitoonoficial.com",
+ "es",
+ SimpleDateFormat("dd/MM/yyyy", Locale("es")),
+) {
+ override val useNewChapterEndpoint = true
+}
diff --git a/multisrc/overrides/madara/visbellum/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/visbellum/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index cd777dc5fa..0000000000
Binary files a/multisrc/overrides/madara/visbellum/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/visbellum/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/visbellum/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index a5874ec461..0000000000
Binary files a/multisrc/overrides/madara/visbellum/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/visbellum/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/visbellum/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 52f273a417..0000000000
Binary files a/multisrc/overrides/madara/visbellum/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/visbellum/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/visbellum/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 3ae6be76f5..0000000000
Binary files a/multisrc/overrides/madara/visbellum/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/visbellum/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/visbellum/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 56ebb3db57..0000000000
Binary files a/multisrc/overrides/madara/visbellum/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/visbellum/res/web_hi_res_512.png b/multisrc/overrides/madara/visbellum/res/web_hi_res_512.png
deleted file mode 100644
index b98919c32b..0000000000
Binary files a/multisrc/overrides/madara/visbellum/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/madara/visbellum/src/Visbellum.kt b/multisrc/overrides/madara/visbellum/src/Visbellum.kt
deleted file mode 100644
index 1421998d23..0000000000
--- a/multisrc/overrides/madara/visbellum/src/Visbellum.kt
+++ /dev/null
@@ -1,20 +0,0 @@
-package eu.kanade.tachiyomi.extension.pt.visbellum
-
-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 Visbellum : Madara(
- "Visbellum",
- "https://visbellum.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()
-}
diff --git a/multisrc/overrides/madara/voircomic/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/voircomic/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index 63777d07e9..0000000000
Binary files a/multisrc/overrides/madara/voircomic/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/voircomic/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/voircomic/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index 393cf245d6..0000000000
Binary files a/multisrc/overrides/madara/voircomic/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/voircomic/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/voircomic/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 1ed4ba3927..0000000000
Binary files a/multisrc/overrides/madara/voircomic/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/voircomic/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/voircomic/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 6142066c46..0000000000
Binary files a/multisrc/overrides/madara/voircomic/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/voircomic/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/voircomic/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 24b220cf46..0000000000
Binary files a/multisrc/overrides/madara/voircomic/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/voircomic/res/web_hi_res_512.png b/multisrc/overrides/madara/voircomic/res/web_hi_res_512.png
deleted file mode 100644
index 4eb393d0b6..0000000000
Binary files a/multisrc/overrides/madara/voircomic/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/madara/voircomic/src/VoirComic.kt b/multisrc/overrides/madara/voircomic/src/VoirComic.kt
deleted file mode 100644
index a5782c0ccb..0000000000
--- a/multisrc/overrides/madara/voircomic/src/VoirComic.kt
+++ /dev/null
@@ -1,7 +0,0 @@
-package eu.kanade.tachiyomi.extension.fr.voircomic
-
-import eu.kanade.tachiyomi.multisrc.madara.Madara
-import java.text.SimpleDateFormat
-import java.util.Locale
-
-class VoirComic : Madara("VoirComic", "https://voircomic.com", "fr", dateFormat = SimpleDateFormat("d MMMM yyyy", Locale.FRANCE))
diff --git a/multisrc/overrides/madara/vortcescan/src/VortceScan.kt b/multisrc/overrides/madara/vortcescan/src/VortceScan.kt
new file mode 100644
index 0000000000..bfc19c29ba
--- /dev/null
+++ b/multisrc/overrides/madara/vortcescan/src/VortceScan.kt
@@ -0,0 +1,20 @@
+package eu.kanade.tachiyomi.extension.pt.vortcescan
+
+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 VortceScan : Madara(
+ "Vórtce Scan",
+ "https://vortcescan.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()
+}
diff --git a/multisrc/overrides/madara/wakascan/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/wakascan/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index e487bc0d72..0000000000
Binary files a/multisrc/overrides/madara/wakascan/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/wakascan/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/wakascan/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index f0bdb8e294..0000000000
Binary files a/multisrc/overrides/madara/wakascan/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/wakascan/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/wakascan/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index bb4e0e986f..0000000000
Binary files a/multisrc/overrides/madara/wakascan/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/wakascan/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/wakascan/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index ff1136c176..0000000000
Binary files a/multisrc/overrides/madara/wakascan/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/wakascan/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/wakascan/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 391dc5f4a5..0000000000
Binary files a/multisrc/overrides/madara/wakascan/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/wakascan/res/web_hi_res_512.png b/multisrc/overrides/madara/wakascan/res/web_hi_res_512.png
deleted file mode 100644
index 027a94f808..0000000000
Binary files a/multisrc/overrides/madara/wakascan/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/madara/warqueenscan/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/warqueenscan/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index 325d68a081..0000000000
Binary files a/multisrc/overrides/madara/warqueenscan/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/warqueenscan/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/warqueenscan/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index 2d60fa9473..0000000000
Binary files a/multisrc/overrides/madara/warqueenscan/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/warqueenscan/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/warqueenscan/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 1ec905994b..0000000000
Binary files a/multisrc/overrides/madara/warqueenscan/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/warqueenscan/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/warqueenscan/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 047d04596c..0000000000
Binary files a/multisrc/overrides/madara/warqueenscan/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/warqueenscan/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/warqueenscan/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index ff8f468ada..0000000000
Binary files a/multisrc/overrides/madara/warqueenscan/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/madara/warqueenscan/res/web_hi_res_512.png b/multisrc/overrides/madara/warqueenscan/res/web_hi_res_512.png
deleted file mode 100644
index 90ec98cea8..0000000000
Binary files a/multisrc/overrides/madara/warqueenscan/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/madara/warqueenscan/src/WarQueenScan.kt b/multisrc/overrides/madara/warqueenscan/src/WarQueenScan.kt
deleted file mode 100644
index 3c485e0d54..0000000000
--- a/multisrc/overrides/madara/warqueenscan/src/WarQueenScan.kt
+++ /dev/null
@@ -1,23 +0,0 @@
-package eu.kanade.tachiyomi.extension.pt.warqueenscan
-
-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 WarQueenScan : Madara(
- "War Queen Scan",
- "https://wqscan.com",
- "pt-BR",
- SimpleDateFormat("yyyy-MM-dd", Locale("pt", "BR")),
-) {
-
- override val client: OkHttpClient = super.client.newBuilder()
- .rateLimit(1, 2, TimeUnit.SECONDS)
- .connectTimeout(1, TimeUnit.MINUTES)
- .readTimeout(1, TimeUnit.MINUTES)
- .writeTimeout(1, TimeUnit.MINUTES)
- .build()
-}
diff --git a/multisrc/overrides/madara/webdexscans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/webdexscans/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..2eeb1cb6da
Binary files /dev/null and b/multisrc/overrides/madara/webdexscans/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/webdexscans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/webdexscans/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..82d9ae249d
Binary files /dev/null and b/multisrc/overrides/madara/webdexscans/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/webdexscans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/webdexscans/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..d29474fad4
Binary files /dev/null and b/multisrc/overrides/madara/webdexscans/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/webdexscans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/webdexscans/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..dc4cc9c2ff
Binary files /dev/null and b/multisrc/overrides/madara/webdexscans/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/webdexscans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/webdexscans/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..b20b7dfc48
Binary files /dev/null and b/multisrc/overrides/madara/webdexscans/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/webdexscans/res/web_hi_res_512.png b/multisrc/overrides/madara/webdexscans/res/web_hi_res_512.png
new file mode 100644
index 0000000000..92757565e2
Binary files /dev/null and b/multisrc/overrides/madara/webdexscans/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/webdexscans/src/WebdexScans.kt b/multisrc/overrides/madara/webdexscans/src/WebdexScans.kt
new file mode 100644
index 0000000000..76a5446485
--- /dev/null
+++ b/multisrc/overrides/madara/webdexscans/src/WebdexScans.kt
@@ -0,0 +1,10 @@
+package eu.kanade.tachiyomi.extension.en.webdexscans
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+
+class WebdexScans : Madara("Webdex Scans", "https://webdexscans.com", "en") {
+ override val useNewChapterEndpoint = true
+ 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/webtooncity/src/WebtoonCity.kt b/multisrc/overrides/madara/webtooncity/src/WebtoonCity.kt
new file mode 100644
index 0000000000..9418a5078b
--- /dev/null
+++ b/multisrc/overrides/madara/webtooncity/src/WebtoonCity.kt
@@ -0,0 +1,10 @@
+package eu.kanade.tachiyomi.extension.en.webtooncity
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+
+class WebtoonCity : Madara("Webtoon City", "https://webtooncity.com", "en") {
+ override val useNewChapterEndpoint = false
+ override val mangaSubString = "webtoon"
+
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
+}
diff --git a/multisrc/overrides/madara/wickedwitchscan/src/WickedWitchScan.kt b/multisrc/overrides/madara/wickedwitchscan/src/WickedWitchScan.kt
new file mode 100644
index 0000000000..50e48664a1
--- /dev/null
+++ b/multisrc/overrides/madara/wickedwitchscan/src/WickedWitchScan.kt
@@ -0,0 +1,17 @@
+package eu.kanade.tachiyomi.extension.pt.wickedwitchscan
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+import okhttp3.OkHttpClient
+import java.text.SimpleDateFormat
+import java.util.Locale
+
+class WickedWitchScan : Madara(
+ "Wicked Witch Scan",
+ "https://wickedwitchscan.com",
+ "pt-BR",
+ SimpleDateFormat("MMMMM dd, yyyy", Locale("pt", "BR")),
+) {
+
+ override val client: OkHttpClient = super.client.newBuilder()
+ .build()
+}
diff --git a/multisrc/overrides/madara/yanpfansub/src/YANPFansub.kt b/multisrc/overrides/madara/yanpfansub/src/YANPFansub.kt
index 1963f693f3..6b468f1efd 100644
--- a/multisrc/overrides/madara/yanpfansub/src/YANPFansub.kt
+++ b/multisrc/overrides/madara/yanpfansub/src/YANPFansub.kt
@@ -20,7 +20,7 @@ class YANPFansub : Madara(
// Scanlator changed the theme from WpMangaReader to Madara.
override val versionId: Int = 2
- override val client: OkHttpClient = network.cloudflareClient.newBuilder()
+ override val client: OkHttpClient = super.client.newBuilder()
.rateLimit(1, 2, TimeUnit.SECONDS)
.addInterceptor(::checkPasswordProtectedIntercept)
.build()
diff --git a/multisrc/overrides/madara/yaoitoshokan/src/YaoiToshokan.kt b/multisrc/overrides/madara/yaoitoshokan/src/YaoiToshokan.kt
index 5855a24f7a..cb76122dad 100644
--- a/multisrc/overrides/madara/yaoitoshokan/src/YaoiToshokan.kt
+++ b/multisrc/overrides/madara/yaoitoshokan/src/YaoiToshokan.kt
@@ -4,7 +4,6 @@ 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.Headers
import okhttp3.OkHttpClient
import okhttp3.Request
import org.jsoup.nodes.Document
@@ -19,10 +18,7 @@ class YaoiToshokan : Madara(
SimpleDateFormat("dd MMM yyyy", Locale("pt", "BR")),
) {
- override fun headersBuilder(): Headers.Builder = super.headersBuilder()
- .removeAll("User-Agent")
-
- override val client: OkHttpClient = network.client.newBuilder()
+ override val client: OkHttpClient = super.client.newBuilder()
.rateLimit(1, 2, TimeUnit.SECONDS)
.build()
diff --git a/multisrc/overrides/madara/yugenmangas/src/YugenMangas.kt b/multisrc/overrides/madara/yugenmangas/src/YugenMangas.kt
deleted file mode 100644
index dc62d586a6..0000000000
--- a/multisrc/overrides/madara/yugenmangas/src/YugenMangas.kt
+++ /dev/null
@@ -1,45 +0,0 @@
-package eu.kanade.tachiyomi.extension.pt.yugenmangas
-
-import eu.kanade.tachiyomi.multisrc.madara.Madara
-import eu.kanade.tachiyomi.network.interceptor.rateLimit
-import eu.kanade.tachiyomi.source.model.SChapter
-import okhttp3.Headers
-import okhttp3.OkHttpClient
-import org.jsoup.nodes.Element
-import java.text.SimpleDateFormat
-import java.util.Locale
-import java.util.concurrent.TimeUnit
-
-class YugenMangas : Madara(
- "YugenMangas",
- "https://yugenmangas.com.br",
- "pt-BR",
- SimpleDateFormat("MMMMM dd, yyyy", Locale("pt", "BR")),
-) {
-
- override val client: OkHttpClient = super.client.newBuilder()
- .addInterceptor(uaIntercept)
- .rateLimit(1, 3, TimeUnit.SECONDS)
- .build()
-
- override fun headersBuilder(): Headers.Builder = Headers.Builder()
- .add("Origin", baseUrl)
- .add("Referer", "$baseUrl/")
-
- override val useNewChapterEndpoint: Boolean = true
-
- override val mangaSubString = "series"
-
- override fun chapterFromElement(element: Element): SChapter = SChapter.create().apply {
- name = element.selectFirst("p.chapter-manhwa-title")!!.text()
- date_upload = parseChapterDate(element.selectFirst("span.chapter-release-date i")?.text())
-
- val chapterUrl = element.selectFirst("a")!!.attr("abs:href")
- setUrlWithoutDomain(
- chapterUrl.substringBefore("?style=paged") +
- if (!chapterUrl.endsWith(chapterUrlSuffix)) chapterUrlSuffix else "",
- )
- }
-
- override val useRandomUserAgentByDefault: Boolean = true
-}
diff --git a/multisrc/overrides/madara/zinmangatop/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/zinmangatop/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..97b1749cfe
Binary files /dev/null and b/multisrc/overrides/madara/zinmangatop/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/zinmangatop/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/zinmangatop/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..660e2fda74
Binary files /dev/null and b/multisrc/overrides/madara/zinmangatop/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/zinmangatop/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/zinmangatop/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..12b451c468
Binary files /dev/null and b/multisrc/overrides/madara/zinmangatop/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/zinmangatop/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/zinmangatop/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..677d119bce
Binary files /dev/null and b/multisrc/overrides/madara/zinmangatop/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/zinmangatop/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/zinmangatop/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..ffc766fa0a
Binary files /dev/null and b/multisrc/overrides/madara/zinmangatop/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/madara/zinmangatop/res/web_hi_res_512.png b/multisrc/overrides/madara/zinmangatop/res/web_hi_res_512.png
new file mode 100644
index 0000000000..bdbde6818d
Binary files /dev/null and b/multisrc/overrides/madara/zinmangatop/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/madara/zinmangatop/src/ZinMangaTop.kt b/multisrc/overrides/madara/zinmangatop/src/ZinMangaTop.kt
new file mode 100644
index 0000000000..445a22ebe4
--- /dev/null
+++ b/multisrc/overrides/madara/zinmangatop/src/ZinMangaTop.kt
@@ -0,0 +1,9 @@
+package eu.kanade.tachiyomi.extension.en.zinmangatop
+
+import eu.kanade.tachiyomi.multisrc.madara.Madara
+
+class ZinMangaTop : Madara("ZinManga.top (unoriginal)", "https://zinmanga.top", "en") {
+ override val useNewChapterEndpoint = true
+
+ override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/"
+}
diff --git a/multisrc/overrides/mangacatalog/readblackclovermangaonline/src/ReadBlackCloverMangaOnline.kt b/multisrc/overrides/mangacatalog/readblackclovermangaonline/src/ReadBlackCloverMangaOnline.kt
new file mode 100644
index 0000000000..1efd430498
--- /dev/null
+++ b/multisrc/overrides/mangacatalog/readblackclovermangaonline/src/ReadBlackCloverMangaOnline.kt
@@ -0,0 +1,12 @@
+package eu.kanade.tachiyomi.extension.en.readblackclovermangaonline
+
+import eu.kanade.tachiyomi.multisrc.mangacatalog.MangaCatalog
+
+class ReadBlackCloverMangaOnline : MangaCatalog("Read Black Clover Manga Online", "https://ww7.readblackclover.com", "en") {
+ override val sourceList = listOf(
+ Pair("Black Clover", "$baseUrl/manga/black-clover"),
+ Pair("Black Clover Gainden Quartet Knights", "$baseUrl/manga/black-clover-gaiden-quartet-knights"),
+ Pair("Fan Colored", "$baseUrl/manga/black-clover-colored"),
+ Pair("Hungry Joker", "$baseUrl/manga/hungry-joker"),
+ )
+}
diff --git a/multisrc/overrides/mangadventure/assortedscans/AndroidManifest.xml b/multisrc/overrides/mangadventure/assortedscans/AndroidManifest.xml
index 227102ee96..0a89d8d68b 100644
--- a/multisrc/overrides/mangadventure/assortedscans/AndroidManifest.xml
+++ b/multisrc/overrides/mangadventure/assortedscans/AndroidManifest.xml
@@ -1,6 +1,5 @@
-
+
-
+
a"
-
- override fun popularMangaFromElement(element: Element) = SManga.create().apply {
- setUrlWithoutDomain(element.attr("href"))
- title = element.select("h3").text().sanitizeTitle()
- thumbnail_url = element.select("img").attr("abs:src")
- }
-
- override fun popularMangaNextPageSelector() = ".pagination__link"
-
- override fun searchMangaRequest(page: Int, query: String, filters: FilterList) =
- GET("$baseUrl/?s=$query&page=$page")
-
- override fun searchMangaFromElement(element: Element) = popularMangaFromElement(element)
-
- override fun searchMangaSelector(): String = ".thumb.item>a"
-
- override fun mangaDetailsParse(document: Document): SManga {
- val manga = SManga.create()
- manga.title = document.select("h1").text().sanitizeTitle()
- manga.description = document.select(".video-info__box.b-content strong").text()
- manga.thumbnail_url = document.select(".player-holder img").attr("abs:src")
-
- val genres = document.select(".category")
- .map { element -> element.text() }
- .toMutableSet()
-
- manga.genre = genres.toList().joinToString(", ")
-
- return manga
- }
-
- override fun Document.getSanitizedDetails(): Element = this
- override fun chapterListSelector() = ".chapter-l a"
- override fun String.sanitizeChapter() = substringAfterLast(" – ").substringBeforeLast("漫画")
-
- override fun pageSelector(): Evaluator {
- return Evaluator.Tag("img")
- }
-
- override fun pageListParse(document: Document): List {
- val position = 32
- val parser = ImageListParser(document.html(), position)
-
- return parser.getImageList().orEmpty().mapIndexed { i, imageUrl ->
- Page(i, imageUrl = imageUrl)
- }
- }
-}
diff --git a/multisrc/overrides/mangareader/mangafire/src/MangaFire.kt b/multisrc/overrides/mangareader/mangafire/src/MangaFire.kt
index 262ded34c7..06d32517d6 100644
--- a/multisrc/overrides/mangareader/mangafire/src/MangaFire.kt
+++ b/multisrc/overrides/mangareader/mangafire/src/MangaFire.kt
@@ -85,15 +85,15 @@ open class MangaFire(
return GET(urlBuilder.build(), headers)
}
- override fun searchMangaSelector() = ".mangas.items .inner"
-
override fun searchMangaNextPageSelector() = ".page-item.active + .page-item .page-link"
+ override fun searchMangaSelector() = ".original.card-lg .unit .inner"
+
override fun searchMangaFromElement(element: Element) =
SManga.create().apply {
- element.selectFirst("a.color-light")!!.let {
- url = it.attr("href")
- title = it.attr("title")
+ element.selectFirst(".info > a")!!.let {
+ setUrlWithoutDomain(it.attr("href"))
+ title = it.ownText()
}
element.selectFirst(Evaluator.Tag("img"))!!.let {
thumbnail_url = it.attr("src")
@@ -101,25 +101,26 @@ open class MangaFire(
}
override fun mangaDetailsParse(document: Document) = SManga.create().apply {
- val root = document.selectFirst(".detail .top .wrapper")!!
- val mangaTitle = root.selectFirst(Evaluator.Class("name"))!!.ownText()
+ val root = document.selectFirst(".info")!!
+ val mangaTitle = root.child(1).ownText()
title = mangaTitle
description = document.run {
- val description = selectFirst(Evaluator.Class("summary"))!!.ownText()
- when (val altTitle = root.selectFirst(Evaluator.Class("al-name"))!!.ownText()) {
+ val description = selectFirst(Evaluator.Class("description"))!!.ownText()
+ when (val altTitle = root.child(2).ownText()) {
"", mangaTitle -> description
else -> "$description\n\nAlternative Title: $altTitle"
}
}
- thumbnail_url = root.selectFirst(Evaluator.Tag("img"))!!.attr("src")
- status = when (root.selectFirst(Evaluator.Class("status"))!!.ownText()) {
+ thumbnail_url = document.selectFirst(".poster")!!
+ .selectFirst("img")!!.attr("src")
+ status = when (root.child(0).ownText()) {
"Completed" -> SManga.COMPLETED
"Releasing" -> SManga.ONGOING
"On_hiatus" -> SManga.ON_HIATUS
"Discontinued" -> SManga.CANCELLED
else -> SManga.UNKNOWN
}
- with(root.selectFirst(Evaluator.Class("more-info"))!!) {
+ with(document.selectFirst(Evaluator.Class("meta"))!!) {
author = selectFirst("span:contains(Author:) + span")?.text()
val type = selectFirst("span:contains(Type:) + span")?.text()
val genres = selectFirst("span:contains(Genres:) + span")?.text()
@@ -132,20 +133,39 @@ open class MangaFire(
override fun chapterListRequest(mangaUrl: String, type: String): Request {
val id = mangaUrl.substringAfterLast('.')
- return GET("$baseUrl/ajax/read/$id/list?viewby=$type", headers)
+ return GET("$baseUrl/ajax/manga/$id/$type/$langCode", headers)
}
override fun parseChapterElements(response: Response, isVolume: Boolean): List {
- val result = json.decodeFromString>(response.body.string()).result
- val container = result.parseHtml(if (isVolume) volumeType else chapterType)
- ?.selectFirst(".numberlist[data-lang=$langCode]")
- ?: return emptyList()
- return container.children().map { it.child(0) }
+ val result = json.decodeFromString>(response.body.string()).result
+ val document = Jsoup.parse(result)
+
+ val elements = document.select("ul li")
+ if (elements.size > 0) {
+ val linkToFirstChapter = elements[0].selectFirst(Evaluator.Tag("a"))!!.attr("href")
+ val mangaId = linkToFirstChapter.toString().substringAfter('.').substringBefore('/')
+
+ val request = GET("$baseUrl/ajax/read/$mangaId/chapter/$langCode", headers)
+ val response = client.newCall(request).execute()
+ val res = json.decodeFromString>(response.body.string()).result.html
+ val chapterInfoDocument = Jsoup.parse(res)
+ val chapters = chapterInfoDocument.select("ul li")
+ for ((i, it) in elements.withIndex()) {
+ it.attr("data-id", chapters[i].select("a").attr("data-id"))
+ }
+ }
+ return elements.toList()
}
+ @Serializable
+ class ChapterIdsDto(
+ val html: String,
+ val title_format: String,
+ )
+
override fun updateChapterList(manga: SManga, chapters: List) {
val document = client.newCall(mangaDetailsRequest(manga)).execute().asJsoup()
- val elements = document.selectFirst(".chapter-list[data-name=$langCode]")!!.children()
+ val elements = document.selectFirst(".scroll-sm")!!.children()
val chapterCount = chapters.size
if (elements.size != chapterCount) throw Exception("Chapter count doesn't match. Try updating again.")
val dateFormat = SimpleDateFormat("MMM dd, yyyy", Locale.US)
@@ -180,6 +200,20 @@ open class MangaFire(
}
}
+ @Serializable
+ class PageListDto(private val images: List>) {
+ val pages get() = images.map {
+ Image(it[0].content, it[2].int)
+ }
+ }
+ class Image(val url: String, val offset: Int)
+
+ @Serializable
+ class ResponseDto(
+ val result: T,
+ val status: Int,
+ )
+
override fun getFilterList() =
FilterList(
Filter.Header("NOTE: Ignored if using text search!"),
@@ -191,22 +225,4 @@ open class MangaFire(
ChapterCountFilter(),
SortFilter(),
)
-
- @Serializable
- class ChapterListDto(private val html: String, private val link_format: String) {
- fun parseHtml(type: String): Document? {
- if ("LANG/$type-NUMBER" !in link_format) return null
- return Jsoup.parseBodyFragment(html)
- }
- }
-
- @Serializable
- class PageListDto(private val images: List>) {
- val pages get() = images.map { Image(it[0].content, it[2].int) }
- }
-
- class Image(val url: String, val offset: Int)
-
- @Serializable
- class ResponseDto(val result: T)
}
diff --git a/multisrc/overrides/mangasar/default/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangasar/default/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index 5f3c83a4c9..0000000000
Binary files a/multisrc/overrides/mangasar/default/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mangasar/default/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangasar/default/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index aa7edff855..0000000000
Binary files a/multisrc/overrides/mangasar/default/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mangasar/default/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangasar/default/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 0dfe9e0759..0000000000
Binary files a/multisrc/overrides/mangasar/default/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mangasar/default/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangasar/default/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 1690d709ea..0000000000
Binary files a/multisrc/overrides/mangasar/default/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mangasar/default/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangasar/default/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 39f7dda6ac..0000000000
Binary files a/multisrc/overrides/mangasar/default/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mangasar/default/res/web_hi_res_512.png b/multisrc/overrides/mangasar/default/res/web_hi_res_512.png
deleted file mode 100644
index 5b26d20e55..0000000000
Binary files a/multisrc/overrides/mangasar/default/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/mangasar/mangasup/src/MangasUp.kt b/multisrc/overrides/mangasar/mangasup/src/MangasUp.kt
deleted file mode 100644
index ff4addb2db..0000000000
--- a/multisrc/overrides/mangasar/mangasup/src/MangasUp.kt
+++ /dev/null
@@ -1,32 +0,0 @@
-package eu.kanade.tachiyomi.extension.pt.mangasup
-
-import eu.kanade.tachiyomi.multisrc.mangasar.MangaSar
-import eu.kanade.tachiyomi.network.GET
-import eu.kanade.tachiyomi.source.model.SChapter
-import eu.kanade.tachiyomi.util.asJsoup
-import okhttp3.Request
-import okhttp3.Response
-import org.jsoup.nodes.Element
-
-class MangasUp : MangaSar(
- "MangásUp",
- "https://mangasup.net",
- "pt-BR",
-) {
-
- override fun chapterListPaginatedRequest(mangaUrl: String, page: Int): Request {
- return GET(baseUrl + mangaUrl, headers)
- }
-
- override fun chapterListParse(response: Response): List {
- return response.asJsoup()
- .select("ul.full-chapters-list > li > a")
- .map(::chapterFromElement)
- }
-
- private fun chapterFromElement(element: Element): SChapter = SChapter.create().apply {
- name = element.selectFirst("span.cap-text")!!.text()
- date_upload = element.selectFirst("span.chapter-date")?.text()?.toDate() ?: 0L
- setUrlWithoutDomain(element.attr("href"))
- }
-}
diff --git a/multisrc/overrides/mangasar/mangazim/src/Mangazim.kt b/multisrc/overrides/mangasar/mangazim/src/Mangazim.kt
deleted file mode 100644
index ca0299f24a..0000000000
--- a/multisrc/overrides/mangasar/mangazim/src/Mangazim.kt
+++ /dev/null
@@ -1,28 +0,0 @@
-package eu.kanade.tachiyomi.extension.pt.mangazim
-
-import eu.kanade.tachiyomi.multisrc.mangasar.MangaSar
-import eu.kanade.tachiyomi.network.GET
-import eu.kanade.tachiyomi.source.model.SChapter
-import eu.kanade.tachiyomi.util.asJsoup
-import okhttp3.Request
-import okhttp3.Response
-import org.jsoup.nodes.Element
-
-class Mangazim : MangaSar("Mangazim", "https://mangazim.com", "pt-BR") {
-
- override fun chapterListPaginatedRequest(mangaUrl: String, page: Int): Request {
- return GET(baseUrl + mangaUrl, headers)
- }
-
- override fun chapterListParse(response: Response): List {
- return response.asJsoup()
- .select("ul.full-chapters-list > li > a")
- .map(::chapterFromElement)
- }
-
- private fun chapterFromElement(element: Element): SChapter = SChapter.create().apply {
- name = element.selectFirst("span.cap-text")!!.text()
- date_upload = element.selectFirst("span.chapter-date")?.text()?.toDate() ?: 0L
- setUrlWithoutDomain(element.attr("href"))
- }
-}
diff --git a/multisrc/overrides/mangasar/seemangas/src/Seemangas.kt b/multisrc/overrides/mangasar/seemangas/src/Seemangas.kt
deleted file mode 100644
index 246e3820f7..0000000000
--- a/multisrc/overrides/mangasar/seemangas/src/Seemangas.kt
+++ /dev/null
@@ -1,136 +0,0 @@
-package eu.kanade.tachiyomi.extension.pt.seemangas
-
-import eu.kanade.tachiyomi.multisrc.mangasar.MangaSar
-import eu.kanade.tachiyomi.multisrc.mangasar.MangaSarLatestDto
-import eu.kanade.tachiyomi.multisrc.mangasar.MangaSarReaderDto
-import eu.kanade.tachiyomi.network.GET
-import eu.kanade.tachiyomi.network.POST
-import eu.kanade.tachiyomi.source.model.MangasPage
-import eu.kanade.tachiyomi.source.model.Page
-import eu.kanade.tachiyomi.source.model.SChapter
-import eu.kanade.tachiyomi.source.model.SManga
-import eu.kanade.tachiyomi.util.asJsoup
-import kotlinx.serialization.json.jsonObject
-import kotlinx.serialization.json.jsonPrimitive
-import okhttp3.FormBody
-import okhttp3.Request
-import okhttp3.Response
-import org.jsoup.nodes.Element
-
-class Seemangas : MangaSar(
- "Seemangas",
- "https://seemangas.com",
- "pt-BR",
-) {
-
- override fun popularMangaSelector() = "ul.sidebar-popular li.popular-treending"
-
- override fun popularMangaFromElement(element: Element): SManga = SManga.create().apply {
- title = element.selectFirst("h4.title")!!.text()
- thumbnail_url = element.selectFirst("div.tumbl img")!!.attr("data-lazy-src")
- setUrlWithoutDomain(element.selectFirst("a")!!.attr("abs:href"))
- }
-
- override fun latestUpdatesRequest(page: Int): Request {
- val payload = FormBody.Builder()
- .add("action", "get_lancamentos")
- .add("pagina", page.toString())
- .build()
-
- val newHeaders = headersBuilder()
- .add("Content-Length", payload.contentLength().toString())
- .add("Content-Type", payload.contentType().toString())
- .add("X-Requested-With", "XMLHttpRequest")
- .build()
-
- return POST("$baseUrl/wp-admin/admin-ajax.php", newHeaders, payload)
- }
-
- override fun latestUpdatesParse(response: Response): MangasPage {
- val result = response.parseAs()
-
- val latestMangas = result.releases
- .map(::latestUpdatesFromObject)
- .distinctBy { it.url }
-
- return MangasPage(latestMangas, hasNextPage = result.releases.isNotEmpty())
- }
-
- override fun mangaDetailsParse(response: Response): SManga {
- val document = response.asJsoup()
- val infoElement = document.selectFirst("div.box-single:has(div.mangapage)")!!
-
- return SManga.create().apply {
- title = infoElement.selectFirst("h1.kw-title")!!.text()
- author = infoElement.selectFirst("div.mdq.author")!!.text().trim()
- description = infoElement.selectFirst("div.sinopse-page")!!.text()
- genre = infoElement.select("div.generos a.widget-btn")!!.joinToString { it.text() }
- status = infoElement.selectFirst("span.mdq")!!.text().toStatus()
- thumbnail_url = infoElement.selectFirst("div.thumb img")!!.attr("abs:data-lazy-src")
- }
- }
- override fun chapterListPaginatedRequest(mangaUrl: String, page: Int): Request {
- return GET(baseUrl + mangaUrl, headers)
- }
-
- override fun chapterListParse(response: Response): List {
- return response.asJsoup()
- .select("ul.full-chapters-list > li > a")
- .map(::chapterFromElement)
- }
-
- private fun chapterFromElement(element: Element): SChapter = SChapter.create().apply {
- name = element.selectFirst("span.cap-text")!!.text()
- date_upload = element.selectFirst("span.chapter-date")?.text()?.toDate() ?: 0L
- setUrlWithoutDomain(element.attr("href"))
- }
-
- override fun pageListApiRequest(chapterUrl: String, serieId: String, token: String): Request {
- val chapterId = CHAPTER_ID_REGEX.find(chapterUrl)!!.groupValues[1]
-
- val payload = FormBody.Builder()
- .add("action", "get_image_list")
- .add("id_serie", chapterId)
- .add("secury", token)
- .build()
-
- val newHeaders = apiHeadersBuilder()
- .add("Content-Length", payload.contentLength().toString())
- .add("Content-Type", payload.contentType().toString())
- .set("Referer", chapterUrl)
- .build()
-
- return POST("$baseUrl/wp-admin/admin-ajax.php", newHeaders, payload)
- }
-
- override fun pageListParse(response: Response): List {
- val document = response.asJsoup()
- val apiParams = document.selectFirst("script:containsData(id_serie)")?.data()
- ?: throw Exception(TOKEN_NOT_FOUND)
-
- val chapterUrl = response.request.url.toString()
- val infoReader = apiParams
- .substringAfter("{")
- .substringBeforeLast("}")
- val readerParams = json.parseToJsonElement("{$infoReader}").jsonObject
- val serieId = readerParams["id_serie"]!!.jsonPrimitive.content
- val token = readerParams["token"]!!.jsonPrimitive.content
-
- val apiRequest = pageListApiRequest(chapterUrl, serieId, token)
- val apiResponse = client.newCall(apiRequest).execute().parseAs()
-
- return apiResponse.images
- .filter { it.url.startsWith("http") }
- .mapIndexed { i, page -> Page(i, chapterUrl, page.url) }
- }
-
- private fun String.toStatus(): Int = when (this) {
- "Em andamento" -> SManga.ONGOING
- "Completo" -> SManga.COMPLETED
- else -> SManga.UNKNOWN
- }
-
- companion object {
- private val CHAPTER_ID_REGEX = "(\\d+)$".toRegex()
- }
-}
diff --git a/multisrc/overrides/mangathemesia/ainzscansid/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/ainzscansid/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..4869653323
Binary files /dev/null and b/multisrc/overrides/mangathemesia/ainzscansid/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/ainzscansid/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/ainzscansid/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..e903ad2974
Binary files /dev/null and b/multisrc/overrides/mangathemesia/ainzscansid/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/ainzscansid/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/ainzscansid/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..39220b47bb
Binary files /dev/null and b/multisrc/overrides/mangathemesia/ainzscansid/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/ainzscansid/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/ainzscansid/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..fd3dc0ce47
Binary files /dev/null and b/multisrc/overrides/mangathemesia/ainzscansid/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/ainzscansid/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/ainzscansid/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..c22fe79652
Binary files /dev/null and b/multisrc/overrides/mangathemesia/ainzscansid/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/ainzscansid/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/ainzscansid/res/web_hi_res_512.png
new file mode 100644
index 0000000000..a4b1a071d6
Binary files /dev/null and b/multisrc/overrides/mangathemesia/ainzscansid/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/mangathemesia/ainzscansid/src/AinzScansID.kt b/multisrc/overrides/mangathemesia/ainzscansid/src/AinzScansID.kt
new file mode 100644
index 0000000000..6bf16b233a
--- /dev/null
+++ b/multisrc/overrides/mangathemesia/ainzscansid/src/AinzScansID.kt
@@ -0,0 +1,8 @@
+package eu.kanade.tachiyomi.extension.id.ainzscansid
+
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+
+class AinzScansID : MangaThemesia("Ainz Scans ID", "https://ainzscans.site", "id", "/series") {
+
+ override val hasProjectPage = true
+}
diff --git a/multisrc/overrides/madara/aiyumanga/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/aiyumanga/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/madara/aiyumanga/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/aiyumanga/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/madara/aiyumanga/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/aiyumanga/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/madara/aiyumanga/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/aiyumanga/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/madara/aiyumanga/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/aiyumanga/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/madara/aiyumanga/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/aiyumanga/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/madara/aiyumanga/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/aiyumanga/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/madara/aiyumanga/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/aiyumanga/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/madara/aiyumanga/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/aiyumanga/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/madara/aiyumanga/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/aiyumanga/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/madara/aiyumanga/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/aiyumanga/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/madara/aiyumanga/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/aiyumanga/res/web_hi_res_512.png
diff --git a/multisrc/overrides/mangathemesia/aiyumanga/src/AiYuManga.kt b/multisrc/overrides/mangathemesia/aiyumanga/src/AiYuManga.kt
new file mode 100644
index 0000000000..7258d67d77
--- /dev/null
+++ b/multisrc/overrides/mangathemesia/aiyumanga/src/AiYuManga.kt
@@ -0,0 +1,21 @@
+package eu.kanade.tachiyomi.extension.es.aiyumanga
+
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+import eu.kanade.tachiyomi.network.interceptor.rateLimit
+import java.text.SimpleDateFormat
+import java.util.Locale
+import java.util.concurrent.TimeUnit
+
+class AiYuManga : MangaThemesia(
+ "AiYuManga",
+ "https://aiyumanhua.com",
+ "es",
+ dateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale("es")),
+) {
+ // Site moved from ZeistManga to MangaThemesia
+ override val versionId = 3
+
+ override val client = super.client.newBuilder()
+ .rateLimit(2, 1, TimeUnit.SECONDS)
+ .build()
+}
diff --git a/multisrc/overrides/mangathemesia/alceascan/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/alceascan/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..dc4ade72cf
Binary files /dev/null and b/multisrc/overrides/mangathemesia/alceascan/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/alceascan/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/alceascan/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..1df5b7a1ff
Binary files /dev/null and b/multisrc/overrides/mangathemesia/alceascan/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/alceascan/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/alceascan/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..2f539dbd78
Binary files /dev/null and b/multisrc/overrides/mangathemesia/alceascan/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/alceascan/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/alceascan/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..8354ada108
Binary files /dev/null and b/multisrc/overrides/mangathemesia/alceascan/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/alceascan/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/alceascan/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..959dee2fbe
Binary files /dev/null and b/multisrc/overrides/mangathemesia/alceascan/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/alceascan/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/alceascan/res/web_hi_res_512.png
new file mode 100644
index 0000000000..4c88e6f345
Binary files /dev/null and b/multisrc/overrides/mangathemesia/alceascan/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/mangathemesia/alceascan/src/Alceascan.kt b/multisrc/overrides/mangathemesia/alceascan/src/Alceascan.kt
new file mode 100644
index 0000000000..e21265f45b
--- /dev/null
+++ b/multisrc/overrides/mangathemesia/alceascan/src/Alceascan.kt
@@ -0,0 +1,17 @@
+package eu.kanade.tachiyomi.extension.id.alceascan
+
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+import eu.kanade.tachiyomi.network.interceptor.rateLimit
+import okhttp3.OkHttpClient
+
+class Alceascan : MangaThemesia("Alceascan", "https://alceascan.my.id", "id") {
+
+ // Website theme changed from zManga to WPMangaThemesia.
+ override val versionId = 2
+
+ override val client: OkHttpClient = super.client.newBuilder()
+ .rateLimit(20, 4)
+ .build()
+
+ override val hasProjectPage = true
+}
diff --git a/multisrc/overrides/mangathemesia/animatedglitchedscans/src/AnimatedGlitchedScans.kt b/multisrc/overrides/mangathemesia/animatedglitchedscans/src/AnimatedGlitchedScans.kt
index d70c658f1d..5821b5f014 100644
--- a/multisrc/overrides/mangathemesia/animatedglitchedscans/src/AnimatedGlitchedScans.kt
+++ b/multisrc/overrides/mangathemesia/animatedglitchedscans/src/AnimatedGlitchedScans.kt
@@ -2,4 +2,4 @@ package eu.kanade.tachiyomi.extension.en.animatedglitchedscans
import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
-class AnimatedGlitchedScans : MangaThemesia("Animated Glitched Scans", "https://anigliscans.com", "en", mangaUrlDirectory = "/series")
+class AnimatedGlitchedScans : MangaThemesia("Animated Glitched Scans", "https://anigliscans.xyz", "en", mangaUrlDirectory = "/series")
diff --git a/multisrc/overrides/mangathemesia/arcanescan/src/Arcanescan.kt b/multisrc/overrides/mangathemesia/arcanescan/src/Arcanescan.kt
deleted file mode 100644
index 835f254408..0000000000
--- a/multisrc/overrides/mangathemesia/arcanescan/src/Arcanescan.kt
+++ /dev/null
@@ -1,12 +0,0 @@
-package eu.kanade.tachiyomi.extension.fr.arcanescan
-
-import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
-import java.text.SimpleDateFormat
-import java.util.Locale
-
-class Arcanescan : MangaThemesia(
- "Arcane scan",
- "https://arcanescan.fr",
- "fr",
- dateFormat = SimpleDateFormat("MMMMM dd, yyyy", Locale.FRANCE),
-)
diff --git a/multisrc/overrides/mangathemesia/areamanga/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/areamanga/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..7df6a260f8
Binary files /dev/null and b/multisrc/overrides/mangathemesia/areamanga/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/areamanga/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/areamanga/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..cfb55ab6ce
Binary files /dev/null and b/multisrc/overrides/mangathemesia/areamanga/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/areamanga/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/areamanga/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..dac425a959
Binary files /dev/null and b/multisrc/overrides/mangathemesia/areamanga/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/areamanga/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/areamanga/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..c1aae1158e
Binary files /dev/null and b/multisrc/overrides/mangathemesia/areamanga/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/areamanga/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/areamanga/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..378c39bdfa
Binary files /dev/null and b/multisrc/overrides/mangathemesia/areamanga/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/areamanga/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/areamanga/res/web_hi_res_512.png
new file mode 100644
index 0000000000..83b42018cd
Binary files /dev/null and b/multisrc/overrides/mangathemesia/areamanga/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/mangathemesia/areamanga/src/AreaManga.kt b/multisrc/overrides/mangathemesia/areamanga/src/AreaManga.kt
new file mode 100644
index 0000000000..ea18cb04a7
--- /dev/null
+++ b/multisrc/overrides/mangathemesia/areamanga/src/AreaManga.kt
@@ -0,0 +1,30 @@
+package eu.kanade.tachiyomi.extension.ar.areamanga
+
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+import eu.kanade.tachiyomi.source.model.SManga
+import java.text.SimpleDateFormat
+import java.util.Locale
+
+class AreaManga : MangaThemesia(
+ "أريا مانجا",
+ "https://www.areascans.net",
+ "ar",
+ dateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale("ar")),
+) {
+ override val seriesArtistSelector =
+ ".tsinfo .imptdt:contains(الرسام) i, ${super.seriesArtistSelector}"
+ override val seriesAuthorSelector =
+ ".tsinfo .imptdt:contains(المؤلف) i, ${super.seriesAuthorSelector}"
+ override val seriesStatusSelector =
+ ".tsinfo .imptdt:contains(الحالة) i, ${super.seriesStatusSelector}"
+ override val seriesTypeSelector =
+ ".tsinfo .imptdt:contains(النوع) i, ${super.seriesTypeSelector}"
+
+ override fun String?.parseStatus() = when {
+ this == null -> SManga.UNKNOWN
+ this.contains("مستمر", ignoreCase = true) -> SManga.ONGOING
+ this.contains("مكتمل", ignoreCase = true) -> SManga.COMPLETED
+ this.contains("متوقف", ignoreCase = true) -> SManga.ON_HIATUS
+ else -> SManga.UNKNOWN
+ }
+}
diff --git a/multisrc/overrides/mangathemesia/arkhamscan/src/ArkhamScan.kt b/multisrc/overrides/mangathemesia/arkhamscan/src/ArkhamScan.kt
new file mode 100644
index 0000000000..868c765448
--- /dev/null
+++ b/multisrc/overrides/mangathemesia/arkhamscan/src/ArkhamScan.kt
@@ -0,0 +1,19 @@
+package eu.kanade.tachiyomi.extension.pt.arkhamscan
+
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+import okhttp3.OkHttpClient
+import java.text.SimpleDateFormat
+import java.util.Locale
+
+class ArkhamScan : MangaThemesia(
+ "Arkham Scan",
+ "https://arkhamscan.com",
+ "pt-BR",
+ dateFormat = SimpleDateFormat("MMMMM dd, yyyy", Locale("pt", "BR")),
+) {
+
+ override val client: OkHttpClient = super.client.newBuilder()
+ .build()
+
+ override val altNamePrefix = "Nomes alternativos: "
+}
diff --git a/multisrc/overrides/mangathemesia/arvenscans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/arvenscans/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..ba568b04b2
Binary files /dev/null and b/multisrc/overrides/mangathemesia/arvenscans/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/arvenscans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/arvenscans/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..25832490aa
Binary files /dev/null and b/multisrc/overrides/mangathemesia/arvenscans/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/arvenscans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/arvenscans/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..74335d56c5
Binary files /dev/null and b/multisrc/overrides/mangathemesia/arvenscans/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/arvenscans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/arvenscans/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..c6f496dee0
Binary files /dev/null and b/multisrc/overrides/mangathemesia/arvenscans/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/arvenscans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/arvenscans/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..a7c865dc88
Binary files /dev/null and b/multisrc/overrides/mangathemesia/arvenscans/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/arvenscans/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/arvenscans/res/web_hi_res_512.png
new file mode 100644
index 0000000000..fdf8ff92d5
Binary files /dev/null and b/multisrc/overrides/mangathemesia/arvenscans/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/mangathemesia/arvenscans/src/ArvenScans.kt b/multisrc/overrides/mangathemesia/arvenscans/src/ArvenScans.kt
new file mode 100644
index 0000000000..3c3c5bcb58
--- /dev/null
+++ b/multisrc/overrides/mangathemesia/arvenscans/src/ArvenScans.kt
@@ -0,0 +1,13 @@
+package eu.kanade.tachiyomi.extension.en.arvenscans
+
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+import eu.kanade.tachiyomi.network.interceptor.rateLimit
+import okhttp3.OkHttpClient
+import java.util.concurrent.TimeUnit
+
+class ArvenScans : MangaThemesia("Arven Scans", "https://arvenscans.com", "en", "/series") {
+
+ override val client: OkHttpClient = super.client.newBuilder()
+ .rateLimit(20, 5, TimeUnit.SECONDS)
+ .build()
+}
diff --git a/multisrc/overrides/mangathemesia/asurascans/src/AsuraScansEn.kt b/multisrc/overrides/mangathemesia/asurascans/src/AsuraScansEn.kt
index c9b473d19f..9de7310af5 100644
--- a/multisrc/overrides/mangathemesia/asurascans/src/AsuraScansEn.kt
+++ b/multisrc/overrides/mangathemesia/asurascans/src/AsuraScansEn.kt
@@ -15,6 +15,7 @@ import kotlinx.serialization.decodeFromString
import kotlinx.serialization.encodeToString
import okhttp3.Interceptor
import okhttp3.OkHttpClient
+import okhttp3.Request
import okhttp3.Response
import org.jsoup.nodes.Document
import org.jsoup.nodes.Element
@@ -28,22 +29,28 @@ import java.util.concurrent.TimeUnit
class AsuraScansEn : MangaThemesia(
"Asura Scans",
- "https://www.asurascans.com",
+ "https://asuratoon.com",
"en",
dateFormat = SimpleDateFormat("MMM d, yyyy", Locale.US),
) {
- private val preferences = Injekt.get().getSharedPreferences("source_$id", 0x0000)
+ private val preferences by lazy {
+ Injekt.get().getSharedPreferences("source_$id", 0x0000)
+ }
+
+ override val baseUrl by lazy {
+ preferences.baseUrlHost.let { "https://$it" }
+ }
- override val client: OkHttpClient = network.cloudflareClient.newBuilder()
+ override val client: OkHttpClient = super.client.newBuilder()
.addInterceptor(::urlChangeInterceptor)
- .addInterceptor(uaIntercept)
- .connectTimeout(10, TimeUnit.SECONDS)
- .readTimeout(30, TimeUnit.SECONDS)
+ .addInterceptor(::domainChangeIntercept)
.rateLimit(1, 3, TimeUnit.SECONDS)
.build()
override val seriesDescriptionSelector = "div.desc p, div.entry-content p, div[itemprop=description]:not(:has(p))"
+ override val seriesArtistSelector = ".fmed b:contains(artist)+span, .infox span:contains(artist)"
+ override val seriesAuthorSelector = ".fmed b:contains(author)+span, .infox span:contains(author)"
override val pageSelector = "div.rdminimal > img, div.rdminimal > p > img, div.rdminimal > a > img, div.rdminimal > p > a > img, " +
"div.rdminimal > noscript > img, div.rdminimal > p > noscript > img, div.rdminimal > a > noscript > img, div.rdminimal > p > a > noscript > img"
@@ -61,6 +68,22 @@ class AsuraScansEn : MangaThemesia(
return super.fetchSearchManga(page, query, filters).tempUrlToPermIfNeeded()
}
+ override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
+ val request = super.searchMangaRequest(page, query, filters)
+ if (query.isBlank()) return request
+
+ val url = request.url.newBuilder()
+ .addPathSegment("page/$page/")
+ .removeAllQueryParameters("page")
+ .removeAllQueryParameters("title")
+ .addQueryParameter("s", query)
+ .build()
+
+ return request.newBuilder()
+ .url(url)
+ .build()
+ }
+
// Temp Url for manga/chapter
override fun fetchChapterList(manga: SManga): Observable> {
val newManga = manga.titleToUrlFrag()
@@ -80,7 +103,7 @@ class AsuraScansEn : MangaThemesia(
.removeSuffix("/")
.substringAfterLast("/")
- val storedSlug = getSlugMap()[dbSlug] ?: dbSlug
+ val storedSlug = preferences.slugMap[dbSlug] ?: dbSlug
return "$baseUrl$mangaUrlDirectory/$storedSlug/"
}
@@ -89,7 +112,7 @@ class AsuraScansEn : MangaThemesia(
override fun pageListParse(document: Document): List {
return document.select(pageSelector)
.filterNot { it.attr("src").isNullOrEmpty() }
- .mapIndexed { i, img -> Page(i, "", img.attr("abs:src")) }
+ .mapIndexed { i, img -> Page(i, document.location(), img.attr("abs:src")) }
}
override fun Element.imgAttr(): String = when {
@@ -111,7 +134,7 @@ class AsuraScansEn : MangaThemesia(
private fun SManga.tempUrlToPermIfNeeded(): SManga {
if (!preferences.permaUrlPref) return this
- val slugMap = getSlugMap().toMutableMap()
+ val slugMap = preferences.slugMap
val sMangaTitleFirstWord = this.title.split(" ")[0]
if (!this.url.contains("/$sMangaTitleFirstWord", ignoreCase = true)) {
@@ -125,7 +148,7 @@ class AsuraScansEn : MangaThemesia(
this.url = "$mangaUrlDirectory/$permaSlug/"
}
- putSlugMap(slugMap)
+ preferences.slugMap = slugMap
return this
}
@@ -154,7 +177,7 @@ class AsuraScansEn : MangaThemesia(
.removeSuffix("/")
.substringAfterLast("/")
- val slugMap = getSlugMap().toMutableMap()
+ val slugMap = preferences.slugMap
val storedSlug = slugMap[dbSlug] ?: dbSlug
@@ -171,7 +194,7 @@ class AsuraScansEn : MangaThemesia(
?: throw IOException("Migrate from Asura to Asura")
slugMap[dbSlug] = newSlug
- putSlugMap(slugMap)
+ preferences.slugMap = slugMap
return chain.proceed(
request.newBuilder()
@@ -183,10 +206,12 @@ class AsuraScansEn : MangaThemesia(
return response
}
- private fun getNewSlug(existingSlug: String, search: String): String? {
+ private fun getNewSlug(existingSlug: String, frag: String): String? {
val permaSlug = existingSlug
.replaceFirst(TEMP_TO_PERM_REGEX, "")
+ val search = frag.substringBefore("#")
+
val mangas = client.newCall(searchMangaRequest(1, search, FilterList()))
.execute()
.use {
@@ -201,22 +226,6 @@ class AsuraScansEn : MangaThemesia(
?.substringAfterLast("/")
}
- private fun putSlugMap(slugMap: MutableMap) {
- val serialized = json.encodeToString(slugMap)
-
- preferences.edit().putString(PREF_URL_MAP, serialized).commit()
- }
-
- private fun getSlugMap(): Map {
- val serialized = preferences.getString(PREF_URL_MAP, null) ?: return emptyMap()
-
- return try {
- json.decodeFromString(serialized)
- } catch (e: Exception) {
- emptyMap()
- }
- }
-
private fun String.toSearchQuery(): String {
return this.trim()
.lowercase()
@@ -224,6 +233,48 @@ class AsuraScansEn : MangaThemesia(
.replace(trailingPlusRegex, "")
}
+ private var lastDomain = ""
+
+ private fun domainChangeIntercept(chain: Interceptor.Chain): Response {
+ val request = chain.request()
+
+ if (request.url.host !in listOf(preferences.baseUrlHost, lastDomain)) {
+ return chain.proceed(request)
+ }
+
+ if (lastDomain.isNotEmpty()) {
+ val newUrl = request.url.newBuilder()
+ .host(preferences.baseUrlHost)
+ .build()
+
+ return chain.proceed(
+ request.newBuilder()
+ .url(newUrl)
+ .build(),
+ )
+ }
+
+ val response = chain.proceed(request)
+
+ if (request.url.host == response.request.url.host) return response
+
+ response.close()
+
+ preferences.baseUrlHost = response.request.url.host
+
+ lastDomain = request.url.host
+
+ val newUrl = request.url.newBuilder()
+ .host(response.request.url.host)
+ .build()
+
+ return chain.proceed(
+ request.newBuilder()
+ .url(newUrl)
+ .build(),
+ )
+ }
+
override fun setupPreferenceScreen(screen: PreferenceScreen) {
SwitchPreferenceCompat(screen.context).apply {
key = PREF_PERM_MANGA_URL_KEY_PREFIX + lang
@@ -232,17 +283,40 @@ class AsuraScansEn : MangaThemesia(
setDefaultValue(true)
}.also(screen::addPreference)
- addRandomAndCustomUserAgentPreferences(screen)
+ super.setupPreferenceScreen(screen)
}
private val SharedPreferences.permaUrlPref
get() = getBoolean(PREF_PERM_MANGA_URL_KEY_PREFIX + lang, true)
+ private var SharedPreferences.slugMap: MutableMap
+ get() {
+ val serialized = getString(PREF_URL_MAP, null) ?: return mutableMapOf()
+
+ return try {
+ json.decodeFromString(serialized)
+ } catch (e: Exception) {
+ mutableMapOf()
+ }
+ }
+ set(slugMap) {
+ val serialized = json.encodeToString(slugMap)
+ edit().putString(PREF_URL_MAP, serialized).commit()
+ }
+
+ private var SharedPreferences.baseUrlHost
+ get() = getString(BASE_URL_PREF, defaultBaseUrlHost) ?: defaultBaseUrlHost
+ set(newHost) {
+ edit().putString(BASE_URL_PREF, newHost).commit()
+ }
+
companion object {
private const val PREF_PERM_MANGA_URL_KEY_PREFIX = "pref_permanent_manga_url_2_"
private const val PREF_PERM_MANGA_URL_TITLE = "Permanent Manga URL"
private const val PREF_PERM_MANGA_URL_SUMMARY = "Turns all manga urls into permanent ones."
private const val PREF_URL_MAP = "pref_url_map"
+ private const val BASE_URL_PREF = "pref_base_url_host"
+ private const val defaultBaseUrlHost = "asuratoon.com"
private val TEMP_TO_PERM_REGEX = Regex("""^\d+-""")
private val titleSpecialCharactersRegex = Regex("""[^a-z0-9]+""")
private val trailingPlusRegex = Regex("""\++$""")
diff --git a/multisrc/overrides/mangathemesia/asurascans/src/AsuraScansTr.kt b/multisrc/overrides/mangathemesia/asurascans/src/AsuraScansTr.kt
index 433569bf33..929af6c76e 100644
--- a/multisrc/overrides/mangathemesia/asurascans/src/AsuraScansTr.kt
+++ b/multisrc/overrides/mangathemesia/asurascans/src/AsuraScansTr.kt
@@ -15,14 +15,11 @@ import java.util.concurrent.TimeUnit
class AsuraScansTr : MangaThemesia(
"Asura Scans",
- "https://asurascanstr.com",
+ "https://armoniscans.com",
"tr",
dateFormat = SimpleDateFormat("MMM d, yyyy", Locale("tr")),
) {
- override val client: OkHttpClient = network.cloudflareClient.newBuilder()
- .addInterceptor(uaIntercept)
- .connectTimeout(10, TimeUnit.SECONDS)
- .readTimeout(30, TimeUnit.SECONDS)
+ override val client: OkHttpClient = super.client.newBuilder()
.rateLimit(1, 3, TimeUnit.SECONDS)
.build()
@@ -53,7 +50,7 @@ class AsuraScansTr : MangaThemesia(
val jsonString = scriptContent.substringAfter("ts_reader.run(").substringBefore(");")
val tsReader = json.decodeFromString(jsonString)
val imageUrls = tsReader.sources.firstOrNull()?.images ?: return emptyList()
- return imageUrls.mapIndexed { index, imageUrl -> Page(index, imageUrl = imageUrl) }
+ return imageUrls.mapIndexed { index, imageUrl -> Page(index, document.location(), imageUrl) }
}
@Serializable
diff --git a/multisrc/overrides/mangathemesia/beastscans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/beastscans/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..45a794664b
Binary files /dev/null and b/multisrc/overrides/mangathemesia/beastscans/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/beastscans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/beastscans/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..3fe369faa3
Binary files /dev/null and b/multisrc/overrides/mangathemesia/beastscans/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/beastscans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/beastscans/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..0ff76471d7
Binary files /dev/null and b/multisrc/overrides/mangathemesia/beastscans/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/beastscans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/beastscans/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..dbd6ebc111
Binary files /dev/null and b/multisrc/overrides/mangathemesia/beastscans/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/beastscans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/beastscans/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..cd8f8e96a7
Binary files /dev/null and b/multisrc/overrides/mangathemesia/beastscans/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/beastscans/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/beastscans/res/web_hi_res_512.png
new file mode 100644
index 0000000000..b90ad2e820
Binary files /dev/null and b/multisrc/overrides/mangathemesia/beastscans/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/mangathemesia/beastscans/src/BeastScans.kt b/multisrc/overrides/mangathemesia/beastscans/src/BeastScans.kt
new file mode 100644
index 0000000000..8447dee413
--- /dev/null
+++ b/multisrc/overrides/mangathemesia/beastscans/src/BeastScans.kt
@@ -0,0 +1,31 @@
+package eu.kanade.tachiyomi.extension.ar.beastscans
+
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+import eu.kanade.tachiyomi.source.model.SManga
+import java.text.SimpleDateFormat
+import java.util.Locale
+
+class BeastScans : MangaThemesia(
+ "Beast Scans",
+ "https://beastscans.net",
+ "ar",
+ dateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale("ar")),
+) {
+ override val seriesArtistSelector =
+ ".infox .fmed:contains(الرسام) span, ${super.seriesArtistSelector}"
+ override val seriesAuthorSelector =
+ ".infox .fmed:contains(المؤلف) span, ${super.seriesAuthorSelector}"
+ override val seriesStatusSelector =
+ ".tsinfo .imptdt:contains(الحالة) i, ${super.seriesStatusSelector}"
+ override val seriesTypeSelector =
+ ".tsinfo .imptdt:contains(النوع) i, ${super.seriesTypeSelector}"
+
+ override fun String?.parseStatus() = when {
+ this == null -> SManga.UNKNOWN
+ listOf("مستمر", "ongoing", "publishing").any { this.contains(it, ignoreCase = true) } -> SManga.ONGOING
+ listOf("متوقف", "hiatus").any { this.contains(it, ignoreCase = true) } -> SManga.ON_HIATUS
+ listOf("مكتمل", "completed").any { this.contains(it, ignoreCase = true) } -> SManga.COMPLETED
+ listOf("dropped", "cancelled").any { this.contains(it, ignoreCase = true) } -> SManga.CANCELLED
+ else -> SManga.UNKNOWN
+ }
+}
diff --git a/multisrc/overrides/mangathemesia/boosei/src/Boosei.kt b/multisrc/overrides/mangathemesia/boosei/src/Boosei.kt
index 20a9a49895..33d0a61690 100644
--- a/multisrc/overrides/mangathemesia/boosei/src/Boosei.kt
+++ b/multisrc/overrides/mangathemesia/boosei/src/Boosei.kt
@@ -3,13 +3,10 @@ package eu.kanade.tachiyomi.extension.id.boosei
import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
import eu.kanade.tachiyomi.network.interceptor.rateLimit
import okhttp3.OkHttpClient
-import java.util.concurrent.TimeUnit
class Boosei : MangaThemesia("Boosei", "https://boosei.net", "id") {
- override val client: OkHttpClient = network.cloudflareClient.newBuilder()
- .connectTimeout(10, TimeUnit.SECONDS)
- .readTimeout(30, TimeUnit.SECONDS)
+ override val client: OkHttpClient = super.client.newBuilder()
.rateLimit(4)
.build()
diff --git a/multisrc/overrides/mangathemesia/clayrer/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/clayrer/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index c1c4b906df..0000000000
Binary files a/multisrc/overrides/mangathemesia/clayrer/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mangathemesia/clayrer/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/clayrer/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index de64ce5990..0000000000
Binary files a/multisrc/overrides/mangathemesia/clayrer/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mangathemesia/clayrer/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/clayrer/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 5d7ec338b3..0000000000
Binary files a/multisrc/overrides/mangathemesia/clayrer/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mangathemesia/clayrer/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/clayrer/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 33a3df730c..0000000000
Binary files a/multisrc/overrides/mangathemesia/clayrer/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mangathemesia/clayrer/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/clayrer/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 6be55bbd06..0000000000
Binary files a/multisrc/overrides/mangathemesia/clayrer/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mangathemesia/clayrer/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/clayrer/res/web_hi_res_512.png
deleted file mode 100644
index 9ab90fa0d7..0000000000
Binary files a/multisrc/overrides/mangathemesia/clayrer/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/mangathemesia/clayrer/src/Clayrer.kt b/multisrc/overrides/mangathemesia/clayrer/src/Clayrer.kt
deleted file mode 100644
index 033cec99ec..0000000000
--- a/multisrc/overrides/mangathemesia/clayrer/src/Clayrer.kt
+++ /dev/null
@@ -1,7 +0,0 @@
-package eu.kanade.tachiyomi.extension.es.clayrer
-
-import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
-import java.text.SimpleDateFormat
-import java.util.Locale
-
-class Clayrer : MangaThemesia("Clayrer", "https://clayrer.net", "es", dateFormat = SimpleDateFormat("MMM d, yyyy", Locale("es")))
diff --git a/multisrc/overrides/mangathemesia/constellarscans/additional.gradle b/multisrc/overrides/mangathemesia/constellarscans/additional.gradle
deleted file mode 100644
index 2505114b36..0000000000
--- a/multisrc/overrides/mangathemesia/constellarscans/additional.gradle
+++ /dev/null
@@ -1,3 +0,0 @@
-dependencies {
- implementation(project(':lib-dataimage'))
-}
\ No newline at end of file
diff --git a/multisrc/overrides/mangathemesia/constellarscans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/constellarscans/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index 37a749336d..0000000000
Binary files a/multisrc/overrides/mangathemesia/constellarscans/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mangathemesia/constellarscans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/constellarscans/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index 910e4e5359..0000000000
Binary files a/multisrc/overrides/mangathemesia/constellarscans/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mangathemesia/constellarscans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/constellarscans/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index a6e9204965..0000000000
Binary files a/multisrc/overrides/mangathemesia/constellarscans/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mangathemesia/constellarscans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/constellarscans/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 85c05d0670..0000000000
Binary files a/multisrc/overrides/mangathemesia/constellarscans/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mangathemesia/constellarscans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/constellarscans/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index d9eaf09202..0000000000
Binary files a/multisrc/overrides/mangathemesia/constellarscans/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mangathemesia/constellarscans/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/constellarscans/res/web_hi_res_512.png
deleted file mode 100644
index a8dd214cc9..0000000000
Binary files a/multisrc/overrides/mangathemesia/constellarscans/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/mangathemesia/constellarscans/src/ConstellarScans.kt b/multisrc/overrides/mangathemesia/constellarscans/src/ConstellarScans.kt
deleted file mode 100644
index 7e96a214da..0000000000
--- a/multisrc/overrides/mangathemesia/constellarscans/src/ConstellarScans.kt
+++ /dev/null
@@ -1,157 +0,0 @@
-package eu.kanade.tachiyomi.extension.en.constellarscans
-
-import android.annotation.SuppressLint
-import android.app.Application
-import android.os.Handler
-import android.os.Looper
-import android.util.Log
-import android.view.View
-import android.webkit.ConsoleMessage
-import android.webkit.JavascriptInterface
-import android.webkit.WebChromeClient
-import android.webkit.WebView
-import eu.kanade.tachiyomi.lib.dataimage.DataImageInterceptor
-import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
-import eu.kanade.tachiyomi.network.GET
-import eu.kanade.tachiyomi.network.interceptor.rateLimit
-import eu.kanade.tachiyomi.source.model.Page
-import eu.kanade.tachiyomi.source.model.SChapter
-import kotlinx.serialization.json.jsonArray
-import kotlinx.serialization.json.jsonObject
-import kotlinx.serialization.json.jsonPrimitive
-import okhttp3.CacheControl
-import okhttp3.Headers
-import okhttp3.Request
-import org.jsoup.nodes.Document
-import uy.kohesive.injekt.Injekt
-import uy.kohesive.injekt.api.get
-import java.util.concurrent.CountDownLatch
-
-class ConstellarScans : MangaThemesia("Constellar Scans", "https://constellarscans.com", "en") {
-
- override val client = super.client.newBuilder()
- .addInterceptor(DataImageInterceptor())
- .rateLimit(1, 3)
- .build()
-
- override fun headersBuilder(): Headers.Builder = Headers.Builder()
- .add("Referer", "$baseUrl/")
- .add("Accept-Language", "en-US,en;q=0.9")
- .add("DNT", "1")
- .add("User-Agent", mobileUserAgent)
- .add("Upgrade-Insecure-Requests", "1")
-
- override val seriesStatusSelector = ".status"
-
- private val mobileUserAgent by lazy {
- val req = GET(UA_DB_URL)
- val data = client.newCall(req).execute().body.use {
- json.parseToJsonElement(it.string()).jsonArray
- }.mapNotNull {
- it.jsonObject["user-agent"]?.jsonPrimitive?.content?.takeIf { ua ->
- ua.startsWith("Mozilla/5.0") &&
- (
- ua.contains("iPhone") &&
- (ua.contains("FxiOS") || ua.contains("CriOS")) ||
- ua.contains("Android") &&
- (ua.contains("EdgA") || ua.contains("Chrome") || ua.contains("Firefox"))
- )
- }
- }
- data.random()
- }
-
- override fun pageListRequest(chapter: SChapter): Request =
- super.pageListRequest(chapter).newBuilder()
- .header(
- "Accept",
- "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9",
- )
- .header("Sec-Fetch-Site", "same-origin")
- .header("Sec-Fetch-Mode", "navigate")
- .header("Sec-Fetch-Dest", "document")
- .header("Sec-Fetch-User", "?1")
- .cacheControl(CacheControl.FORCE_NETWORK)
- .build()
-
- internal class JsObject(val imageList: MutableList = mutableListOf()) {
- @JavascriptInterface
- fun passSingleImage(url: String) {
- Log.d("constellarscans", "received image: $url")
- imageList.add(url)
- }
- }
-
- private fun randomString(length: Int = 10): String {
- val charPool = ('a'..'z') + ('A'..'Z')
- return List(length) { charPool.random() }.joinToString("")
- }
-
- private val funkyScript by lazy {
- client.newCall(GET(FUNKY_SCRIPT_URL)).execute().body.string()
- }
-
- @SuppressLint("SetJavaScriptEnabled")
- override fun pageListParse(document: Document): List {
- val interfaceName = randomString()
- document.body().prepend("")
-
- val handler = Handler(Looper.getMainLooper())
- val latch = CountDownLatch(1)
- val jsInterface = JsObject()
- var webView: WebView? = null
- handler.post {
- val webview = WebView(Injekt.get())
- webView = webview
- webview.settings.javaScriptEnabled = true
- webview.settings.domStorageEnabled = true
- webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null)
- webview.settings.useWideViewPort = false
- webview.settings.loadWithOverviewMode = false
- webview.settings.userAgentString = mobileUserAgent
- webview.addJavascriptInterface(jsInterface, interfaceName)
-
- webview.webChromeClient = object : WebChromeClient() {
- override fun onProgressChanged(view: WebView?, newProgress: Int) {
- if (newProgress == 100) {
- latch.countDown()
- }
- }
-
- override fun onConsoleMessage(consoleMessage: ConsoleMessage?): Boolean {
- if (consoleMessage == null) { return false }
- val logContent = "wv: ${consoleMessage.message()} ${consoleMessage.sourceId()}, line ${consoleMessage.lineNumber()}"
- when (consoleMessage.messageLevel()) {
- ConsoleMessage.MessageLevel.DEBUG -> Log.d("constellarscans", logContent)
- ConsoleMessage.MessageLevel.ERROR -> Log.e("constellarscans", logContent)
- ConsoleMessage.MessageLevel.LOG -> Log.i("constellarscans", logContent)
- ConsoleMessage.MessageLevel.TIP -> Log.i("constellarscans", logContent)
- ConsoleMessage.MessageLevel.WARNING -> Log.w("constellarscans", logContent)
- else -> Log.d("constellarscans", logContent)
- }
-
- return true
- }
- }
- Log.d("constellarscans", "starting webview shenanigans")
- webview.loadDataWithBaseURL(baseUrl, document.toString(), "text/html", "UTF-8", null)
- }
-
- latch.await()
- handler.post { webView?.destroy() }
- return jsInterface.imageList.mapIndexed { idx, it -> Page(idx, imageUrl = it) }
- }
-
- override fun imageRequest(page: Page): Request = super.imageRequest(page).newBuilder()
- .header("Accept", "image/webp,image/apng,image/svg+xml,image/*,*/*;q=0.8")
- .header("Sec-Fetch-Dest", "image")
- .header("Sec-Fetch-Mode", "no-cors")
- .header("Sec-Fetch-Site", "same-origin")
- .build()
-
- companion object {
- const val UA_DB_URL =
- "https://cdn.jsdelivr.net/gh/mimmi20/browscap-helper@30a83c095688f40b9eaca0165a479c661e5a7fbe/tests/0002999.json"
- val FUNKY_SCRIPT_URL = "https://cdn.jsdelivr.net/npm/@beerpsi/funky-script@latest/constellar.js"
- }
-}
diff --git a/multisrc/overrides/mangathemesia/cosmicscans/src/CosmicScans.kt b/multisrc/overrides/mangathemesia/cosmicscans/src/CosmicScans.kt
index f4c8868487..b56b4e6b6e 100644
--- a/multisrc/overrides/mangathemesia/cosmicscans/src/CosmicScans.kt
+++ b/multisrc/overrides/mangathemesia/cosmicscans/src/CosmicScans.kt
@@ -2,6 +2,6 @@ package eu.kanade.tachiyomi.extension.en.cosmicscans
import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
-class CosmicScans : MangaThemesia("Cosmic Scans", "https://cosmicscans.com", "en") {
+class CosmicScans : MangaThemesia("Cosmic Scans", "https://cosmic-scans.com", "en") {
override val pageSelector = "div#readerarea img[data-src]"
}
diff --git a/multisrc/overrides/mangathemesia/cosmicscansid/src/CosmicScansID.kt b/multisrc/overrides/mangathemesia/cosmicscansid/src/CosmicScansID.kt
index 26a5a578cd..4df60eb891 100644
--- a/multisrc/overrides/mangathemesia/cosmicscansid/src/CosmicScansID.kt
+++ b/multisrc/overrides/mangathemesia/cosmicscansid/src/CosmicScansID.kt
@@ -1,8 +1,61 @@
package eu.kanade.tachiyomi.extension.id.cosmicscansid
import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+import eu.kanade.tachiyomi.network.GET
+import eu.kanade.tachiyomi.network.interceptor.rateLimit
+import eu.kanade.tachiyomi.source.model.Filter
+import eu.kanade.tachiyomi.source.model.FilterList
+import okhttp3.HttpUrl.Companion.toHttpUrl
+import okhttp3.OkHttpClient
+import okhttp3.Request
+import java.util.concurrent.TimeUnit
-class CosmicScansID : MangaThemesia("CosmicScans.id", "https://cosmicscans.id", "id") {
+class CosmicScansID : MangaThemesia("CosmicScans.id", "https://cosmicscans.id", "id", "/semua-komik") {
+
+ override val client: OkHttpClient = super.client.newBuilder()
+ .rateLimit(20, 4, TimeUnit.SECONDS)
+ .build()
override val hasProjectPage = true
+ override val projectPageString = "/semua-komik"
+
+ override fun latestUpdatesRequest(page: Int) = GET("$baseUrl" + if (page > 1) "/page/$page" else "", headers)
+
+ // search
+ override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
+ val url = baseUrl.toHttpUrl().newBuilder()
+ .addPathSegments("page/$page/")
+ .addQueryParameter("s", query)
+
+ filters.forEach { filter ->
+ when (filter) {
+ // if site has project page, default value "hasProjectPage" = false
+ is ProjectFilter -> {
+ if (filter.selectedValue() == "project-filter-on") {
+ url.setPathSegment(0, projectPageString.substring(1))
+ }
+ }
+ else -> { /* Do Nothing */ }
+ }
+ }
+ return GET(url.toString())
+ }
+
+ override fun searchMangaSelector() = ".bixbox:not(.hothome):has(.hpage) .utao .uta .imgu, .bixbox:not(.hothome) .listupd .bs .bsx"
+
+ override fun getFilterList(): FilterList {
+ val filters = mutableListOf>(
+ Filter.Separator(),
+ Filter.Header("$name Project List page"),
+ ProjectFilter(),
+ OrderByFilter(),
+ )
+ return FilterList(filters)
+ }
+
+ // manga details
+ override val seriesDescriptionSelector = ".entry-content[itemprop=description] :not(a,p:has(a))"
+
+ // pages
+ override val pageSelector = "div#readerarea img:not(noscript img)"
}
diff --git a/multisrc/overrides/mangathemesia/default/AndroidManifest.xml b/multisrc/overrides/mangathemesia/default/AndroidManifest.xml
index ded43d296e..3db1038222 100644
--- a/multisrc/overrides/mangathemesia/default/AndroidManifest.xml
+++ b/multisrc/overrides/mangathemesia/default/AndroidManifest.xml
@@ -1,6 +1,5 @@
-
+
-
\ No newline at end of file
+
diff --git a/multisrc/overrides/mangathemesia/default/additional.gradle b/multisrc/overrides/mangathemesia/default/additional.gradle
new file mode 100644
index 0000000000..57807a7d07
--- /dev/null
+++ b/multisrc/overrides/mangathemesia/default/additional.gradle
@@ -0,0 +1,3 @@
+dependencies {
+ implementation(project(":lib-randomua"))
+}
diff --git a/multisrc/overrides/mangathemesia/diskusscan/src/DiskusScan.kt b/multisrc/overrides/mangathemesia/diskusscan/src/DiskusScan.kt
index bb45ae6281..17bf4b5c03 100644
--- a/multisrc/overrides/mangathemesia/diskusscan/src/DiskusScan.kt
+++ b/multisrc/overrides/mangathemesia/diskusscan/src/DiskusScan.kt
@@ -1,8 +1,13 @@
package eu.kanade.tachiyomi.extension.pt.diskusscan
import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.network.interceptor.rateLimit
+import eu.kanade.tachiyomi.source.model.Page
+import eu.kanade.tachiyomi.source.model.SManga
+import okhttp3.Headers
import okhttp3.OkHttpClient
+import okhttp3.Request
import java.text.SimpleDateFormat
import java.util.Locale
import java.util.concurrent.TimeUnit
@@ -18,6 +23,38 @@ class DiskusScan : MangaThemesia(
override val versionId = 2
override val client: OkHttpClient = super.client.newBuilder()
- .rateLimit(1, 2, TimeUnit.SECONDS)
+ .rateLimit(2, 1, TimeUnit.SECONDS)
.build()
+
+ override fun headersBuilder(): Headers.Builder = super.headersBuilder()
+ .set("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7")
+ .set("Accept-Language", "pt-BR,pt;q=0.9,en-US;q=0.8,en;q=0.7,es;q=0.6,gl;q=0.5")
+ .set("Dnt", "1")
+ .set("Sec-Fetch-Dest", "document")
+ .set("Sec-Fetch-Mode", "navigate")
+ .set("Sec-Fetch-Site", "same-origin")
+ .set("Sec-Fetch-User", "?1")
+
+ override fun mangaDetailsRequest(manga: SManga): Request {
+ val newHeaders = headersBuilder()
+ .set("Referer", baseUrl + mangaUrlDirectory)
+ .build()
+
+ return GET(baseUrl + manga.url, newHeaders)
+ }
+
+ override val seriesAuthorSelector = ".infotable tr:contains(Autor) td:last-child"
+ override val seriesDescriptionSelector = ".entry-content[itemprop=description] > *:not([class^=disku])"
+
+ override fun chapterListRequest(manga: SManga) = mangaDetailsRequest(manga)
+
+ override fun imageUrlRequest(page: Page): Request {
+ val newHeaders = super.imageUrlRequest(page).headers.newBuilder()
+ .set("Sec-Fetch-Dest", "image")
+ .set("Sec-Fetch-Mode", "no-cors")
+ .set("Sec-Fetch-Site", "cross-site")
+ .build()
+
+ return GET(page.imageUrl!!, newHeaders)
+ }
}
diff --git a/multisrc/overrides/mangathemesia/dojingnet/src/DojingNet.kt b/multisrc/overrides/mangathemesia/dojingnet/src/DojingNet.kt
index bd326bbf52..60e0003152 100644
--- a/multisrc/overrides/mangathemesia/dojingnet/src/DojingNet.kt
+++ b/multisrc/overrides/mangathemesia/dojingnet/src/DojingNet.kt
@@ -3,13 +3,10 @@ package eu.kanade.tachiyomi.extension.id.dojingnet
import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
import eu.kanade.tachiyomi.network.interceptor.rateLimit
import okhttp3.OkHttpClient
-import java.util.concurrent.TimeUnit
class DojingNet : MangaThemesia("Dojing.net", "https://dojing.net", "id") {
- override val client: OkHttpClient = network.cloudflareClient.newBuilder()
- .connectTimeout(10, TimeUnit.SECONDS)
- .readTimeout(30, TimeUnit.SECONDS)
+ override val client: OkHttpClient = super.client.newBuilder()
.rateLimit(4)
.build()
diff --git a/multisrc/overrides/mangathemesia/dragontranslation/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/dragontranslation/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index 144f3530d7..0000000000
Binary files a/multisrc/overrides/mangathemesia/dragontranslation/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mangathemesia/dragontranslation/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/dragontranslation/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index d30f74496d..0000000000
Binary files a/multisrc/overrides/mangathemesia/dragontranslation/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mangathemesia/dragontranslation/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/dragontranslation/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 7e25b185ab..0000000000
Binary files a/multisrc/overrides/mangathemesia/dragontranslation/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mangathemesia/dragontranslation/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/dragontranslation/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 70a89d4607..0000000000
Binary files a/multisrc/overrides/mangathemesia/dragontranslation/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mangathemesia/dragontranslation/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/dragontranslation/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index d4ec8796b1..0000000000
Binary files a/multisrc/overrides/mangathemesia/dragontranslation/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mangathemesia/dragontranslation/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/dragontranslation/res/web_hi_res_512.png
deleted file mode 100644
index b39ae07d2e..0000000000
Binary files a/multisrc/overrides/mangathemesia/dragontranslation/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/mangathemesia/dragontranslation/src/DragonTranslation.kt b/multisrc/overrides/mangathemesia/dragontranslation/src/DragonTranslation.kt
deleted file mode 100644
index 1f80427371..0000000000
--- a/multisrc/overrides/mangathemesia/dragontranslation/src/DragonTranslation.kt
+++ /dev/null
@@ -1,13 +0,0 @@
-package eu.kanade.tachiyomi.extension.es.dragontranslation
-
-import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
-import java.text.SimpleDateFormat
-import java.util.Locale
-
-class DragonTranslation : MangaThemesia(
- "DragonTranslation",
- "https://dragontranslation.com",
- "es",
- mangaUrlDirectory = "/manga",
- dateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale("en")),
-)
diff --git a/multisrc/overrides/mangathemesia/duniakomikid/src/DuniaKomikId.kt b/multisrc/overrides/mangathemesia/duniakomikid/src/DuniaKomikId.kt
index 24352c5cf3..1c1bc531a5 100644
--- a/multisrc/overrides/mangathemesia/duniakomikid/src/DuniaKomikId.kt
+++ b/multisrc/overrides/mangathemesia/duniakomikid/src/DuniaKomikId.kt
@@ -1,8 +1,10 @@
package eu.kanade.tachiyomi.extension.id.duniakomikid
import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+import java.text.SimpleDateFormat
+import java.util.Locale
-class DuniaKomikId : MangaThemesia("DuniaKomik.id", "https://duniakomik.id", "id") {
+class DuniaKomikId : MangaThemesia("DuniaKomik.id", "https://duniakomik.org", "id", dateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale("id", "ID"))) {
override val hasProjectPage = true
}
diff --git a/multisrc/overrides/mangathemesia/elarcpage/src/ElarcPage.kt b/multisrc/overrides/mangathemesia/elarcpage/src/ElarcPage.kt
index 18cfa12e14..192a8be3c5 100644
--- a/multisrc/overrides/mangathemesia/elarcpage/src/ElarcPage.kt
+++ b/multisrc/overrides/mangathemesia/elarcpage/src/ElarcPage.kt
@@ -2,4 +2,11 @@ package eu.kanade.tachiyomi.extension.en.elarcpage
import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
-class ElarcPage : MangaThemesia("ElarcPage", "https://elarcpage.com", "en", "/series")
+class ElarcPage : MangaThemesia(
+ "Elarc Reader",
+ "https://elarcreader.com",
+ "en",
+ "/series",
+) {
+ override val id = 5482125641807211052
+}
diff --git a/multisrc/overrides/mangathemesia/enryumanga/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/enryumanga/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..47370da2ff
Binary files /dev/null and b/multisrc/overrides/mangathemesia/enryumanga/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/enryumanga/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/enryumanga/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..e7091505f2
Binary files /dev/null and b/multisrc/overrides/mangathemesia/enryumanga/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/enryumanga/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/enryumanga/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..ca9fb349ba
Binary files /dev/null and b/multisrc/overrides/mangathemesia/enryumanga/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/enryumanga/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/enryumanga/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..f1fc6417ea
Binary files /dev/null and b/multisrc/overrides/mangathemesia/enryumanga/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/enryumanga/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/enryumanga/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..e2ab65b8cb
Binary files /dev/null and b/multisrc/overrides/mangathemesia/enryumanga/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/enryumanga/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/enryumanga/res/web_hi_res_512.png
new file mode 100644
index 0000000000..e966355906
Binary files /dev/null and b/multisrc/overrides/mangathemesia/enryumanga/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/mangathemesia/enryumanga/src/EnryuManga.kt b/multisrc/overrides/mangathemesia/enryumanga/src/EnryuManga.kt
new file mode 100644
index 0000000000..d43a904961
--- /dev/null
+++ b/multisrc/overrides/mangathemesia/enryumanga/src/EnryuManga.kt
@@ -0,0 +1,5 @@
+package eu.kanade.tachiyomi.extension.en.enryumanga
+
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+
+class EnryuManga : MangaThemesia("EnryuManga", "https://enryumanga.com", "en")
diff --git a/multisrc/overrides/mangathemesia/evilproduction/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/evilproduction/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..71ff37e5aa
Binary files /dev/null and b/multisrc/overrides/mangathemesia/evilproduction/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/evilproduction/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/evilproduction/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..347eeb7378
Binary files /dev/null and b/multisrc/overrides/mangathemesia/evilproduction/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/evilproduction/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/evilproduction/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..69834f77a3
Binary files /dev/null and b/multisrc/overrides/mangathemesia/evilproduction/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/evilproduction/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/evilproduction/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..b462e985ff
Binary files /dev/null and b/multisrc/overrides/mangathemesia/evilproduction/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/evilproduction/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/evilproduction/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..5eac76645d
Binary files /dev/null and b/multisrc/overrides/mangathemesia/evilproduction/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/evilproduction/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/evilproduction/res/web_hi_res_512.png
new file mode 100644
index 0000000000..8b820b2f75
Binary files /dev/null and b/multisrc/overrides/mangathemesia/evilproduction/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/mangathemesia/flamescans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/flamecomics/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/mangathemesia/flamescans/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/flamecomics/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/mangathemesia/flamescans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/flamecomics/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/mangathemesia/flamescans/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/flamecomics/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/mangathemesia/flamescans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/flamecomics/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/mangathemesia/flamescans/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/flamecomics/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/mangathemesia/flamescans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/flamecomics/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/mangathemesia/flamescans/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/flamecomics/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/mangathemesia/flamescans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/flamecomics/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/mangathemesia/flamescans/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/flamecomics/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/mangathemesia/flamescans/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/flamecomics/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/mangathemesia/flamescans/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/flamecomics/res/web_hi_res_512.png
diff --git a/multisrc/overrides/mangathemesia/flamecomics/src/FlameComics.kt b/multisrc/overrides/mangathemesia/flamecomics/src/FlameComics.kt
new file mode 100644
index 0000000000..8e7fe96e66
--- /dev/null
+++ b/multisrc/overrides/mangathemesia/flamecomics/src/FlameComics.kt
@@ -0,0 +1,240 @@
+package eu.kanade.tachiyomi.extension.en.flamecomics
+
+import android.app.Application
+import android.graphics.Bitmap
+import android.graphics.BitmapFactory
+import android.graphics.Canvas
+import android.graphics.Rect
+import androidx.preference.PreferenceScreen
+import androidx.preference.SwitchPreferenceCompat
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+import eu.kanade.tachiyomi.network.interceptor.rateLimit
+import eu.kanade.tachiyomi.source.model.FilterList
+import eu.kanade.tachiyomi.source.model.MangasPage
+import eu.kanade.tachiyomi.source.model.Page
+import eu.kanade.tachiyomi.source.model.SChapter
+import eu.kanade.tachiyomi.source.model.SManga
+import okhttp3.Interceptor
+import okhttp3.MediaType.Companion.toMediaType
+import okhttp3.Protocol
+import okhttp3.Response
+import okhttp3.ResponseBody.Companion.toResponseBody
+import org.jsoup.nodes.Document
+import rx.Observable
+import uy.kohesive.injekt.Injekt
+import uy.kohesive.injekt.api.get
+import java.io.ByteArrayOutputStream
+
+class FlameComics : MangaThemesia(
+ "Flame Comics",
+ "https://flamecomics.com",
+ "en",
+ mangaUrlDirectory = "/series",
+) {
+
+ // Flame Scans -> Flame Comics
+ override val id = 6350607071566689772
+
+ private val preferences by lazy {
+ Injekt.get().getSharedPreferences("source_$id", 0x0000)
+ }
+
+ override val client = super.client.newBuilder()
+ .rateLimit(2, 7)
+ .addInterceptor(::composedImageIntercept)
+ .build()
+
+ // Split Image Fixer Start
+ private val composedSelector: String = "#readerarea div.figure_container div.composed_figure"
+
+ override fun pageListParse(document: Document): List {
+ val hasSplitImages = document
+ .select(composedSelector)
+ .firstOrNull() != null
+
+ if (!hasSplitImages) {
+ return super.pageListParse(document)
+ }
+
+ return document.select("#readerarea p:has(img), $composedSelector").toList()
+ .filter {
+ it.select("img").all { imgEl ->
+ imgEl.attr("abs:src").isNullOrEmpty().not()
+ }
+ }
+ .mapIndexed { i, el ->
+ if (el.tagName() == "p") {
+ Page(i, "", el.select("img").attr("abs:src"))
+ } else {
+ val imageUrls = el.select("img")
+ .joinToString("|") { it.attr("abs:src") }
+
+ Page(i, document.location(), imageUrls + COMPOSED_SUFFIX)
+ }
+ }
+ }
+
+ private fun composedImageIntercept(chain: Interceptor.Chain): Response {
+ if (!chain.request().url.toString().endsWith(COMPOSED_SUFFIX)) {
+ return chain.proceed(chain.request())
+ }
+
+ val imageUrls = chain.request().url.toString()
+ .removeSuffix(COMPOSED_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())
+
+ width += bitmap.width
+ height = bitmap.height
+
+ bitmap
+ }
+
+ 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)
+
+ left += bitmap.width
+ }
+
+ val output = ByteArrayOutputStream()
+ result.compress(Bitmap.CompressFormat.PNG, 100, output)
+
+ val responseBody = output.toByteArray().toResponseBody(MEDIA_TYPE)
+
+ return Response.Builder()
+ .code(200)
+ .protocol(Protocol.HTTP_1_1)
+ .request(chain.request())
+ .message("OK")
+ .body(responseBody)
+ .build()
+ }
+ // Split Image Fixer End
+
+ // Permanent Url start
+ override fun fetchPopularManga(page: Int): Observable {
+ return super.fetchPopularManga(page).tempUrlToPermIfNeeded()
+ }
+
+ override fun fetchLatestUpdates(page: Int): Observable {
+ return super.fetchLatestUpdates(page).tempUrlToPermIfNeeded()
+ }
+
+ override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable {
+ return super.fetchSearchManga(page, query, filters).tempUrlToPermIfNeeded()
+ }
+
+ private fun Observable.tempUrlToPermIfNeeded(): Observable {
+ return this.map { mangasPage ->
+ MangasPage(
+ mangasPage.mangas.map { it.tempUrlToPermIfNeeded() },
+ mangasPage.hasNextPage,
+ )
+ }
+ }
+
+ private fun SManga.tempUrlToPermIfNeeded(): SManga {
+ val turnTempUrlToPerm = preferences.getBoolean(getPermanentMangaUrlPreferenceKey(), true)
+ if (!turnTempUrlToPerm) return this
+
+ val path = this.url.removePrefix("/").removeSuffix("/").split("/")
+ path.lastOrNull()?.let { slug -> this.url = "$mangaUrlDirectory/${deobfuscateSlug(slug)}/" }
+
+ return this
+ }
+
+ override fun fetchChapterList(manga: SManga) = super.fetchChapterList(manga.tempUrlToPermIfNeeded())
+ .map { sChapterList -> sChapterList.map { it.tempUrlToPermIfNeeded() } }
+
+ private fun SChapter.tempUrlToPermIfNeeded(): SChapter {
+ val turnTempUrlToPerm = preferences.getBoolean(getPermanentChapterUrlPreferenceKey(), true)
+ if (!turnTempUrlToPerm) return this
+
+ val path = this.url.removePrefix("/").removeSuffix("/").split("/")
+ path.lastOrNull()?.let { slug -> this.url = "/${deobfuscateSlug(slug)}/" }
+ return this
+ }
+
+ override fun setupPreferenceScreen(screen: PreferenceScreen) {
+ val permanentMangaUrlPref = SwitchPreferenceCompat(screen.context).apply {
+ key = getPermanentMangaUrlPreferenceKey()
+ title = PREF_PERM_MANGA_URL_TITLE
+ summary = PREF_PERM_MANGA_URL_SUMMARY
+ setDefaultValue(true)
+
+ setOnPreferenceChangeListener { _, newValue ->
+ val checkValue = newValue as Boolean
+ preferences.edit()
+ .putBoolean(getPermanentMangaUrlPreferenceKey(), checkValue)
+ .commit()
+ }
+ }
+ val permanentChapterUrlPref = SwitchPreferenceCompat(screen.context).apply {
+ key = getPermanentChapterUrlPreferenceKey()
+ title = PREF_PERM_CHAPTER_URL_TITLE
+ summary = PREF_PERM_CHAPTER_URL_SUMMARY
+ setDefaultValue(true)
+
+ setOnPreferenceChangeListener { _, newValue ->
+ val checkValue = newValue as Boolean
+ preferences.edit()
+ .putBoolean(getPermanentChapterUrlPreferenceKey(), checkValue)
+ .commit()
+ }
+ }
+ screen.addPreference(permanentMangaUrlPref)
+ screen.addPreference(permanentChapterUrlPref)
+ }
+
+ private fun getPermanentMangaUrlPreferenceKey(): String {
+ return PREF_PERM_MANGA_URL_KEY_PREFIX + lang
+ }
+
+ private fun getPermanentChapterUrlPreferenceKey(): String {
+ return PREF_PERM_CHAPTER_URL_KEY_PREFIX + lang
+ }
+ // Permanent Url for Manga/Chapter End
+
+ companion object {
+ private const val COMPOSED_SUFFIX = "?comp"
+
+ private const val PREF_PERM_MANGA_URL_KEY_PREFIX = "pref_permanent_manga_url_"
+ private const val PREF_PERM_MANGA_URL_TITLE = "Permanent Manga URL"
+ private const val PREF_PERM_MANGA_URL_SUMMARY = "Turns all manga urls into permanent ones."
+
+ private const val PREF_PERM_CHAPTER_URL_KEY_PREFIX = "pref_permanent_chapter_url"
+ private const val PREF_PERM_CHAPTER_URL_TITLE = "Permanent Chapter URL"
+ private const val PREF_PERM_CHAPTER_URL_SUMMARY = "Turns all chapter urls into permanent ones."
+
+ /**
+ *
+ * De-obfuscates the slug of a series or chapter to the permanent slug
+ * * For a series: "12345678-this-is-a-series" -> "this-is-a-series"
+ * * For a chapter: "12345678-this-is-a-series-chapter-1" -> "this-is-a-series-chapter-1"
+ *
+ * @param obfuscated_slug the obfuscated slug of a series or chapter
+ *
+ * @return
+ */
+ private fun deobfuscateSlug(obfuscated_slug: String) = obfuscated_slug
+ .replaceFirst(Regex("""^\d+-"""), "")
+
+ private val MEDIA_TYPE = "image/png".toMediaType()
+ }
+}
diff --git a/multisrc/overrides/mangathemesia/flamescans/src/FlameScans.kt b/multisrc/overrides/mangathemesia/flamescans/src/FlameScans.kt
deleted file mode 100644
index a36616de87..0000000000
--- a/multisrc/overrides/mangathemesia/flamescans/src/FlameScans.kt
+++ /dev/null
@@ -1,250 +0,0 @@
-package eu.kanade.tachiyomi.extension.all.flamescans
-
-import android.app.Application
-import android.content.SharedPreferences
-import android.graphics.Bitmap
-import android.graphics.BitmapFactory
-import android.graphics.Canvas
-import android.graphics.Rect
-import androidx.preference.PreferenceScreen
-import androidx.preference.SwitchPreferenceCompat
-import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
-import eu.kanade.tachiyomi.source.ConfigurableSource
-import eu.kanade.tachiyomi.source.model.FilterList
-import eu.kanade.tachiyomi.source.model.MangasPage
-import eu.kanade.tachiyomi.source.model.Page
-import eu.kanade.tachiyomi.source.model.SChapter
-import eu.kanade.tachiyomi.source.model.SManga
-import okhttp3.Interceptor
-import okhttp3.MediaType.Companion.toMediaType
-import okhttp3.OkHttpClient
-import okhttp3.Protocol
-import okhttp3.Response
-import okhttp3.ResponseBody.Companion.toResponseBody
-import org.jsoup.nodes.Document
-import rx.Observable
-import uy.kohesive.injekt.Injekt
-import uy.kohesive.injekt.api.get
-import java.io.ByteArrayOutputStream
-import java.text.SimpleDateFormat
-import java.util.Locale
-import java.util.concurrent.TimeUnit
-
-open class FlameScans(
- override val baseUrl: String,
- override val lang: String,
- mangaUrlDirectory: String,
- dateFormat: SimpleDateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale.US),
-) : MangaThemesia(
- "Flame Scans",
- baseUrl,
- lang,
- mangaUrlDirectory = mangaUrlDirectory,
- dateFormat = dateFormat,
-),
- ConfigurableSource {
-
- private val preferences: SharedPreferences by lazy {
- Injekt.get().getSharedPreferences("source_$id", 0x0000)
- }
-
- override val client: OkHttpClient = network.cloudflareClient.newBuilder()
- .connectTimeout(10, TimeUnit.SECONDS)
- .readTimeout(30, TimeUnit.SECONDS)
- .addInterceptor(::composedImageIntercept)
- .build()
-
- // Split Image Fixer Start
- private val composedSelector: String = "#readerarea div.figure_container div.composed_figure"
-
- override fun pageListParse(document: Document): List {
- val hasSplitImages = document
- .select(composedSelector)
- .firstOrNull() != null
-
- if (!hasSplitImages) {
- return super.pageListParse(document)
- }
-
- return document.select("#readerarea p:has(img), $composedSelector").toList()
- .filter {
- it.select("img").all { imgEl ->
- imgEl.attr("abs:src").isNullOrEmpty().not()
- }
- }
- .mapIndexed { i, el ->
- if (el.tagName() == "p") {
- Page(i, "", el.select("img").attr("abs:src"))
- } else {
- val imageUrls = el.select("img")
- .joinToString("|") { it.attr("abs:src") }
-
- Page(i, "", imageUrls + COMPOSED_SUFFIX)
- }
- }
- }
-
- private fun composedImageIntercept(chain: Interceptor.Chain): Response {
- if (!chain.request().url.toString().endsWith(COMPOSED_SUFFIX)) {
- return chain.proceed(chain.request())
- }
-
- val imageUrls = chain.request().url.toString()
- .removeSuffix(COMPOSED_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())
-
- width += bitmap.width
- height = bitmap.height
-
- bitmap
- }
-
- 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)
-
- left += bitmap.width
- }
-
- val output = ByteArrayOutputStream()
- result.compress(Bitmap.CompressFormat.PNG, 100, output)
-
- val responseBody = output.toByteArray().toResponseBody(MEDIA_TYPE)
-
- return Response.Builder()
- .code(200)
- .protocol(Protocol.HTTP_1_1)
- .request(chain.request())
- .message("OK")
- .body(responseBody)
- .build()
- }
- // Split Image Fixer End
-
- // Permanent Url start
- override fun fetchPopularManga(page: Int): Observable {
- return super.fetchPopularManga(page).tempUrlToPermIfNeeded()
- }
-
- override fun fetchLatestUpdates(page: Int): Observable {
- return super.fetchLatestUpdates(page).tempUrlToPermIfNeeded()
- }
-
- override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable {
- return super.fetchSearchManga(page, query, filters).tempUrlToPermIfNeeded()
- }
-
- private fun Observable.tempUrlToPermIfNeeded(): Observable {
- return this.map { mangasPage ->
- MangasPage(
- mangasPage.mangas.map { it.tempUrlToPermIfNeeded() },
- mangasPage.hasNextPage,
- )
- }
- }
-
- private fun SManga.tempUrlToPermIfNeeded(): SManga {
- val turnTempUrlToPerm = preferences.getBoolean(getPermanentMangaUrlPreferenceKey(), true)
- if (!turnTempUrlToPerm) return this
-
- val path = this.url.removePrefix("/").removeSuffix("/").split("/")
- path.lastOrNull()?.let { slug -> this.url = "$mangaUrlDirectory/${deobfuscateSlug(slug)}/" }
-
- return this
- }
-
- override fun fetchChapterList(manga: SManga) = super.fetchChapterList(manga.tempUrlToPermIfNeeded())
- .map { sChapterList -> sChapterList.map { it.tempUrlToPermIfNeeded() } }
-
- private fun SChapter.tempUrlToPermIfNeeded(): SChapter {
- val turnTempUrlToPerm = preferences.getBoolean(getPermanentChapterUrlPreferenceKey(), true)
- if (!turnTempUrlToPerm) return this
-
- val path = this.url.removePrefix("/").removeSuffix("/").split("/")
- path.lastOrNull()?.let { slug -> this.url = "/${deobfuscateSlug(slug)}/" }
- return this
- }
-
- override fun setupPreferenceScreen(screen: PreferenceScreen) {
- val permanentMangaUrlPref = SwitchPreferenceCompat(screen.context).apply {
- key = getPermanentMangaUrlPreferenceKey()
- title = PREF_PERM_MANGA_URL_TITLE
- summary = PREF_PERM_MANGA_URL_SUMMARY
- setDefaultValue(true)
-
- setOnPreferenceChangeListener { _, newValue ->
- val checkValue = newValue as Boolean
- preferences.edit()
- .putBoolean(getPermanentMangaUrlPreferenceKey(), checkValue)
- .commit()
- }
- }
- val permanentChapterUrlPref = SwitchPreferenceCompat(screen.context).apply {
- key = getPermanentChapterUrlPreferenceKey()
- title = PREF_PERM_CHAPTER_URL_TITLE
- summary = PREF_PERM_CHAPTER_URL_SUMMARY
- setDefaultValue(true)
-
- setOnPreferenceChangeListener { _, newValue ->
- val checkValue = newValue as Boolean
- preferences.edit()
- .putBoolean(getPermanentChapterUrlPreferenceKey(), checkValue)
- .commit()
- }
- }
- screen.addPreference(permanentMangaUrlPref)
- screen.addPreference(permanentChapterUrlPref)
- }
-
- private fun getPermanentMangaUrlPreferenceKey(): String {
- return PREF_PERM_MANGA_URL_KEY_PREFIX + lang
- }
-
- private fun getPermanentChapterUrlPreferenceKey(): String {
- return PREF_PERM_CHAPTER_URL_KEY_PREFIX + lang
- }
- // Permanent Url for Manga/Chapter End
-
- companion object {
- private const val COMPOSED_SUFFIX = "?comp"
-
- private const val PREF_PERM_MANGA_URL_KEY_PREFIX = "pref_permanent_manga_url_"
- private const val PREF_PERM_MANGA_URL_TITLE = "Permanent Manga URL"
- private const val PREF_PERM_MANGA_URL_SUMMARY = "Turns all manga urls into permanent ones."
-
- private const val PREF_PERM_CHAPTER_URL_KEY_PREFIX = "pref_permanent_chapter_url"
- private const val PREF_PERM_CHAPTER_URL_TITLE = "Permanent Chapter URL"
- private const val PREF_PERM_CHAPTER_URL_SUMMARY = "Turns all chapter urls into permanent ones."
-
- /**
- *
- * De-obfuscates the slug of a series or chapter to the permanent slug
- * * For a series: "12345678-this-is-a-series" -> "this-is-a-series"
- * * For a chapter: "12345678-this-is-a-series-chapter-1" -> "this-is-a-series-chapter-1"
- *
- * @param obfuscated_slug the obfuscated slug of a series or chapter
- *
- * @return
- */
- private fun deobfuscateSlug(obfuscated_slug: String) = obfuscated_slug
- .replaceFirst(Regex("""^\d+-"""), "")
-
- private val MEDIA_TYPE = "image/png".toMediaType()
- }
-}
diff --git a/multisrc/overrides/mangathemesia/flamescans/src/FlameScansFactory.kt b/multisrc/overrides/mangathemesia/flamescans/src/FlameScansFactory.kt
deleted file mode 100644
index a617de108e..0000000000
--- a/multisrc/overrides/mangathemesia/flamescans/src/FlameScansFactory.kt
+++ /dev/null
@@ -1,18 +0,0 @@
-package eu.kanade.tachiyomi.extension.all.flamescans
-
-import eu.kanade.tachiyomi.network.interceptor.rateLimit
-import eu.kanade.tachiyomi.source.SourceFactory
-import okhttp3.OkHttpClient
-import java.util.concurrent.TimeUnit
-
-class FlameScansFactory : SourceFactory {
- override fun createSources() = listOf(
- FlameScansEn(),
- )
-}
-
-class FlameScansEn : FlameScans("https://flamescans.org", "en", "/series") {
- override val client: OkHttpClient = super.client.newBuilder()
- .rateLimit(2, 7, TimeUnit.SECONDS)
- .build()
-}
diff --git a/multisrc/overrides/mangathemesia/franxxmangas/src/FranxxMangas.kt b/multisrc/overrides/mangathemesia/franxxmangas/src/FranxxMangas.kt
index 1c5733419b..1baec64a98 100644
--- a/multisrc/overrides/mangathemesia/franxxmangas/src/FranxxMangas.kt
+++ b/multisrc/overrides/mangathemesia/franxxmangas/src/FranxxMangas.kt
@@ -14,7 +14,7 @@ class FranxxMangas : MangaThemesia(
dateFormat = SimpleDateFormat("MMMMM dd, yyyy", Locale("pt", "BR")),
) {
- override val client: OkHttpClient = network.cloudflareClient.newBuilder()
+ override val client: OkHttpClient = super.client.newBuilder()
.rateLimit(1, 2, TimeUnit.SECONDS)
.build()
diff --git a/multisrc/overrides/mangathemesia/freakscans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/freakscans/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..ec9aa71ea4
Binary files /dev/null and b/multisrc/overrides/mangathemesia/freakscans/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/freakscans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/freakscans/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..785df315da
Binary files /dev/null and b/multisrc/overrides/mangathemesia/freakscans/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/freakscans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/freakscans/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..e4dafca7c6
Binary files /dev/null and b/multisrc/overrides/mangathemesia/freakscans/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/freakscans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/freakscans/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..9438d6cc8b
Binary files /dev/null and b/multisrc/overrides/mangathemesia/freakscans/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/freakscans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/freakscans/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..9d2308118f
Binary files /dev/null and b/multisrc/overrides/mangathemesia/freakscans/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/freakscans/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/freakscans/res/web_hi_res_512.png
new file mode 100644
index 0000000000..910ae2e466
Binary files /dev/null and b/multisrc/overrides/mangathemesia/freakscans/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/mangathemesia/gloryscans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/gloryscans/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..6ddc46b2c4
Binary files /dev/null and b/multisrc/overrides/mangathemesia/gloryscans/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/gloryscans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/gloryscans/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..40f1e4c67a
Binary files /dev/null and b/multisrc/overrides/mangathemesia/gloryscans/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/gloryscans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/gloryscans/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..50b0015b26
Binary files /dev/null and b/multisrc/overrides/mangathemesia/gloryscans/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/gloryscans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/gloryscans/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..ae4d9b0686
Binary files /dev/null and b/multisrc/overrides/mangathemesia/gloryscans/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/gloryscans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/gloryscans/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..c40afe39dc
Binary files /dev/null and b/multisrc/overrides/mangathemesia/gloryscans/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/gloryscans/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/gloryscans/res/web_hi_res_512.png
new file mode 100644
index 0000000000..0a055b362a
Binary files /dev/null and b/multisrc/overrides/mangathemesia/gloryscans/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/mangathemesia/gloryscans/src/GloryScans.kt b/multisrc/overrides/mangathemesia/gloryscans/src/GloryScans.kt
new file mode 100644
index 0000000000..68341a68bd
--- /dev/null
+++ b/multisrc/overrides/mangathemesia/gloryscans/src/GloryScans.kt
@@ -0,0 +1,7 @@
+package eu.kanade.tachiyomi.extension.fr.gloryscans
+
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+import java.text.SimpleDateFormat
+import java.util.Locale
+
+class GloryScans : MangaThemesia("Glory Scans", "https://gloryscans.fr", "fr", dateFormat = SimpleDateFormat("MMMM d, yyyy", Locale.FRENCH))
diff --git a/multisrc/overrides/mangathemesia/inarimanga/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/inarimanga/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..c062736329
Binary files /dev/null and b/multisrc/overrides/mangathemesia/inarimanga/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/inarimanga/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/inarimanga/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..bae7699182
Binary files /dev/null and b/multisrc/overrides/mangathemesia/inarimanga/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/inarimanga/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/inarimanga/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..a8b079d0cf
Binary files /dev/null and b/multisrc/overrides/mangathemesia/inarimanga/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/inarimanga/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/inarimanga/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..ca514203cd
Binary files /dev/null and b/multisrc/overrides/mangathemesia/inarimanga/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/inarimanga/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/inarimanga/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..a032912972
Binary files /dev/null and b/multisrc/overrides/mangathemesia/inarimanga/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/inarimanga/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/inarimanga/res/web_hi_res_512.png
new file mode 100644
index 0000000000..98d3d08fc8
Binary files /dev/null and b/multisrc/overrides/mangathemesia/inarimanga/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/mangathemesia/inarimanga/src/InariManga.kt b/multisrc/overrides/mangathemesia/inarimanga/src/InariManga.kt
new file mode 100644
index 0000000000..87be16d3de
--- /dev/null
+++ b/multisrc/overrides/mangathemesia/inarimanga/src/InariManga.kt
@@ -0,0 +1,22 @@
+package eu.kanade.tachiyomi.extension.es.inarimanga
+
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+import eu.kanade.tachiyomi.network.interceptor.rateLimitHost
+import okhttp3.HttpUrl.Companion.toHttpUrl
+import java.text.SimpleDateFormat
+import java.util.Locale
+
+class InariManga : MangaThemesia(
+ "InariManga",
+ "https://inarimanga.com",
+ "es",
+ dateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale("en")),
+) {
+
+ // Site moved from Madara to MangaThemesia
+ override val versionId = 2
+
+ override val client = super.client.newBuilder()
+ .rateLimitHost(baseUrl.toHttpUrl(), 4, 1)
+ .build()
+}
diff --git a/multisrc/overrides/mangathemesia/inazumanga/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/inazumanga/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..ed114ef136
Binary files /dev/null and b/multisrc/overrides/mangathemesia/inazumanga/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/inazumanga/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/inazumanga/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..cf25681544
Binary files /dev/null and b/multisrc/overrides/mangathemesia/inazumanga/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/inazumanga/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/inazumanga/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..c9a90ee0ed
Binary files /dev/null and b/multisrc/overrides/mangathemesia/inazumanga/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/inazumanga/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/inazumanga/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..bc84ea60e7
Binary files /dev/null and b/multisrc/overrides/mangathemesia/inazumanga/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/inazumanga/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/inazumanga/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..227934af6c
Binary files /dev/null and b/multisrc/overrides/mangathemesia/inazumanga/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/inazumanga/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/inazumanga/res/web_hi_res_512.png
new file mode 100644
index 0000000000..371275e294
Binary files /dev/null and b/multisrc/overrides/mangathemesia/inazumanga/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/mangathemesia/inazumanga/src/YumeKomik.kt b/multisrc/overrides/mangathemesia/inazumanga/src/YumeKomik.kt
new file mode 100644
index 0000000000..6e73a3c4ca
--- /dev/null
+++ b/multisrc/overrides/mangathemesia/inazumanga/src/YumeKomik.kt
@@ -0,0 +1,14 @@
+package eu.kanade.tachiyomi.extension.id.inazumanga
+
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+import eu.kanade.tachiyomi.network.interceptor.rateLimit
+import okhttp3.OkHttpClient
+
+class YumeKomik : MangaThemesia("YumeKomik", "https://yumekomik.com", "id") {
+
+ override val client: OkHttpClient = super.client.newBuilder()
+ .rateLimit(3)
+ .build()
+
+ override val hasProjectPage = true
+}
diff --git a/multisrc/overrides/mangathemesia/kaiscans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/kaiscans/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..7fc58c5b0d
Binary files /dev/null and b/multisrc/overrides/mangathemesia/kaiscans/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/kaiscans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/kaiscans/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..8c71a27bfb
Binary files /dev/null and b/multisrc/overrides/mangathemesia/kaiscans/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/kaiscans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/kaiscans/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..24f6d60433
Binary files /dev/null and b/multisrc/overrides/mangathemesia/kaiscans/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/kaiscans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/kaiscans/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..b55f3f3413
Binary files /dev/null and b/multisrc/overrides/mangathemesia/kaiscans/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/kaiscans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/kaiscans/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..16a1f8ec19
Binary files /dev/null and b/multisrc/overrides/mangathemesia/kaiscans/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/kaiscans/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/kaiscans/res/web_hi_res_512.png
new file mode 100644
index 0000000000..b869c62d60
Binary files /dev/null and b/multisrc/overrides/mangathemesia/kaiscans/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/mangathemesia/kaiscans/src/KaiScans.kt b/multisrc/overrides/mangathemesia/kaiscans/src/KaiScans.kt
new file mode 100644
index 0000000000..a79d6c9176
--- /dev/null
+++ b/multisrc/overrides/mangathemesia/kaiscans/src/KaiScans.kt
@@ -0,0 +1,5 @@
+package eu.kanade.tachiyomi.extension.en.kaiscans
+
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+
+class KaiScans : MangaThemesia("Kai Scans", "https://www.kaiscans.com", "en", mangaUrlDirectory = "/series")
diff --git a/multisrc/overrides/mangathemesia/kanzenin/src/Kanzenin.kt b/multisrc/overrides/mangathemesia/kanzenin/src/Kanzenin.kt
new file mode 100644
index 0000000000..5371524dbe
--- /dev/null
+++ b/multisrc/overrides/mangathemesia/kanzenin/src/Kanzenin.kt
@@ -0,0 +1,12 @@
+package eu.kanade.tachiyomi.extension.id.kanzenin
+
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+import java.text.SimpleDateFormat
+import java.util.Locale
+
+class Kanzenin : MangaThemesia(
+ "Kanzenin",
+ "https://kanzenin.info",
+ "id",
+ dateFormat = SimpleDateFormat("MMMM d, yyyy", Locale("id")),
+)
diff --git a/multisrc/overrides/mangathemesia/kingofshojo/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/kingofshojo/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..ab3cf45972
Binary files /dev/null and b/multisrc/overrides/mangathemesia/kingofshojo/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/kingofshojo/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/kingofshojo/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..05f996bdc2
Binary files /dev/null and b/multisrc/overrides/mangathemesia/kingofshojo/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/kingofshojo/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/kingofshojo/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..e4c5b10da1
Binary files /dev/null and b/multisrc/overrides/mangathemesia/kingofshojo/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/kingofshojo/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/kingofshojo/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..fa79d12c9d
Binary files /dev/null and b/multisrc/overrides/mangathemesia/kingofshojo/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/kingofshojo/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/kingofshojo/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..883586188e
Binary files /dev/null and b/multisrc/overrides/mangathemesia/kingofshojo/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/kingofshojo/src/KingofShojo.kt b/multisrc/overrides/mangathemesia/kingofshojo/src/KingofShojo.kt
new file mode 100644
index 0000000000..9f4696ecf5
--- /dev/null
+++ b/multisrc/overrides/mangathemesia/kingofshojo/src/KingofShojo.kt
@@ -0,0 +1,10 @@
+package eu.kanade.tachiyomi.extension.ar.kingofshojo
+
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+import java.text.SimpleDateFormat
+import java.util.Locale
+
+class KingofShojo : MangaThemesia("King of Shojo", "https://kingofshojo.com", "ar", dateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale("ar"))) {
+
+ override val hasProjectPage = true
+}
diff --git a/multisrc/overrides/mangathemesia/kiryuu/src/Kiryuu.kt b/multisrc/overrides/mangathemesia/kiryuu/src/Kiryuu.kt
index 74d2c613a4..1d5df8691d 100644
--- a/multisrc/overrides/mangathemesia/kiryuu/src/Kiryuu.kt
+++ b/multisrc/overrides/mangathemesia/kiryuu/src/Kiryuu.kt
@@ -6,15 +6,12 @@ import okhttp3.OkHttpClient
import org.jsoup.nodes.Document
import java.text.SimpleDateFormat
import java.util.Locale
-import java.util.concurrent.TimeUnit
class Kiryuu : MangaThemesia("Kiryuu", "https://kiryuu.id", "id", dateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale("id"))) {
// Formerly "Kiryuu (WP Manga Stream)"
override val id = 3639673976007021338
- override val client: OkHttpClient = network.cloudflareClient.newBuilder()
- .connectTimeout(10, TimeUnit.SECONDS)
- .readTimeout(30, TimeUnit.SECONDS)
+ override val client: OkHttpClient = super.client.newBuilder()
.rateLimit(4)
.build()
diff --git a/multisrc/overrides/mangathemesia/komikav/src/KomikAV.kt b/multisrc/overrides/mangathemesia/komikav/src/KomikAV.kt
index c2c5770367..1802c33989 100644
--- a/multisrc/overrides/mangathemesia/komikav/src/KomikAV.kt
+++ b/multisrc/overrides/mangathemesia/komikav/src/KomikAV.kt
@@ -8,7 +8,6 @@ import okhttp3.OkHttpClient
import okhttp3.Request
import java.text.SimpleDateFormat
import java.util.Locale
-import java.util.concurrent.TimeUnit
class KomikAV : MangaThemesia(
"Komik AV (WP Manga Stream)",
@@ -19,9 +18,7 @@ class KomikAV : MangaThemesia(
// Formerly "Komik AV (WP Manga Stream)"
override val id = 7875815514004535629
- override val client: OkHttpClient = network.cloudflareClient.newBuilder()
- .connectTimeout(10, TimeUnit.SECONDS)
- .readTimeout(30, TimeUnit.SECONDS)
+ override val client: OkHttpClient = super.client.newBuilder()
.rateLimit(4)
.build()
diff --git a/multisrc/overrides/mangathemesia/komikcast/src/KomikCast.kt b/multisrc/overrides/mangathemesia/komikcast/src/KomikCast.kt
index 7a0fbdd217..27c080a6f9 100644
--- a/multisrc/overrides/mangathemesia/komikcast/src/KomikCast.kt
+++ b/multisrc/overrides/mangathemesia/komikcast/src/KomikCast.kt
@@ -7,6 +7,7 @@ import eu.kanade.tachiyomi.source.model.Filter
import eu.kanade.tachiyomi.source.model.FilterList
import eu.kanade.tachiyomi.source.model.Page
import eu.kanade.tachiyomi.source.model.SChapter
+import eu.kanade.tachiyomi.source.model.SManga
import kotlinx.serialization.json.jsonArray
import kotlinx.serialization.json.jsonObject
import okhttp3.Headers
@@ -17,27 +18,20 @@ import org.jsoup.Jsoup
import org.jsoup.nodes.Document
import org.jsoup.nodes.Element
import java.util.Calendar
-import java.util.concurrent.TimeUnit
-
-class KomikCast : MangaThemesia(
- "Komik Cast",
- baseUrl = "https://komikcast.io",
- "id",
- mangaUrlDirectory = "/daftar-komik",
-) {
+import java.util.Locale
+
+class KomikCast : MangaThemesia("Komik Cast", "https://komikcast.lol", "id", "/daftar-komik") {
+
// Formerly "Komik Cast (WP Manga Stream)"
override val id = 972717448578983812
- override val client: OkHttpClient = network.cloudflareClient.newBuilder()
- .connectTimeout(10, TimeUnit.SECONDS)
- .readTimeout(30, TimeUnit.SECONDS)
+ override val client: OkHttpClient = super.client.newBuilder()
.rateLimit(3)
.build()
- override fun headersBuilder(): Headers.Builder = Headers.Builder()
+ override fun headersBuilder(): Headers.Builder = super.headersBuilder()
.add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9")
.add("Accept-language", "en-US,en;q=0.9,id;q=0.8")
- .add("Referer", baseUrl)
override fun imageRequest(page: Page): Request {
val newHeaders = headersBuilder()
@@ -71,12 +65,43 @@ class KomikCast : MangaThemesia(
override val seriesThumbnailSelector = ".komik_info-content-thumbnail img"
override val seriesStatusSelector = ".komik_info-content-info:contains(Status)"
+ override fun mangaDetailsParse(document: Document) = SManga.create().apply {
+ document.selectFirst(seriesDetailsSelector)?.let { seriesDetails ->
+ title = seriesDetails.selectFirst(seriesTitleSelector)?.text()
+ ?.replace("bahasa indonesia", "", ignoreCase = true)?.trim().orEmpty()
+ artist = seriesDetails.selectFirst(seriesArtistSelector)?.ownText().removeEmptyPlaceholder()
+ author = seriesDetails.selectFirst(seriesAuthorSelector)?.ownText().removeEmptyPlaceholder()
+ description = seriesDetails.select(seriesDescriptionSelector).joinToString("\n") { it.text() }.trim()
+ // Add alternative name to manga description
+ val altName = seriesDetails.selectFirst(seriesAltNameSelector)?.ownText().takeIf { it.isNullOrBlank().not() }
+ altName?.let {
+ description = "$description\n\n$altNamePrefix$altName".trim()
+ }
+ val genres = seriesDetails.select(seriesGenreSelector).map { it.text() }.toMutableList()
+ // Add series type (manga/manhwa/manhua/other) to genre
+ seriesDetails.selectFirst(seriesTypeSelector)?.ownText().takeIf { it.isNullOrBlank().not() }?.let { genres.add(it) }
+ genre = genres.map { genre ->
+ genre.lowercase(Locale.forLanguageTag(lang)).replaceFirstChar { char ->
+ if (char.isLowerCase()) {
+ char.titlecase(Locale.forLanguageTag(lang))
+ } else {
+ char.toString()
+ }
+ }
+ }
+ .joinToString { it.trim() }
+
+ status = seriesDetails.selectFirst(seriesStatusSelector)?.text().parseStatus()
+ thumbnail_url = seriesDetails.select(seriesThumbnailSelector).imgAttr()
+ }
+ }
+
override fun chapterListSelector() = "div.komik_info-chapters li"
override fun chapterFromElement(element: Element) = SChapter.create().apply {
val urlElements = element.select("a")
setUrlWithoutDomain(urlElements.attr("href"))
- name = element.select(".lch a, .chapternum")!!.text().ifBlank { urlElements.first()!!.text() }
+ name = element.select(".chapter-link-item").text()
date_upload = parseChapterDate2(element.select(".chapter-link-time").text())
}
@@ -133,7 +158,7 @@ class KomikCast : MangaThemesia(
}
return doc.select(cssQuery)
- .mapIndexed { i, img -> Page(i, "", img.imgAttr()) }
+ .mapIndexed { i, img -> Page(i, document.location(), img.imgAttr()) }
}
override val hasProjectPage: Boolean = true
@@ -218,17 +243,11 @@ class KomikCast : MangaThemesia(
OrderByFilter(),
Filter.Header("Genre exclusion is not available for all sources"),
GenreListFilter(getGenreList()),
+ Filter.Separator(),
+ Filter.Header("NOTE: Can't be used with other filter!"),
+ Filter.Header("$name Project List page"),
+ ProjectFilter(),
)
- if (hasProjectPage) {
- filters.addAll(
- mutableListOf>(
- Filter.Separator(),
- Filter.Header("NOTE: Can't be used with other filter!"),
- Filter.Header("$name Project List page"),
- ProjectFilter(),
- ),
- )
- }
return FilterList(filters)
}
}
diff --git a/multisrc/overrides/mangathemesia/komikdewasa/src/KomikDewasa.kt b/multisrc/overrides/mangathemesia/komikdewasa/src/KomikDewasa.kt
index 98380340de..75b799fddb 100644
--- a/multisrc/overrides/mangathemesia/komikdewasa/src/KomikDewasa.kt
+++ b/multisrc/overrides/mangathemesia/komikdewasa/src/KomikDewasa.kt
@@ -3,12 +3,9 @@ package eu.kanade.tachiyomi.extension.id.komikdewasa
import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
import eu.kanade.tachiyomi.network.interceptor.rateLimit
import okhttp3.OkHttpClient
-import java.util.concurrent.TimeUnit
class KomikDewasa : MangaThemesia("KomikDewasa", "https://komikdewasa.org", "id", "/komik") {
- override val client: OkHttpClient = network.cloudflareClient.newBuilder()
- .connectTimeout(10, TimeUnit.SECONDS)
- .readTimeout(30, TimeUnit.SECONDS)
+ override val client: OkHttpClient = super.client.newBuilder()
.rateLimit(4)
.build()
diff --git a/multisrc/overrides/mangathemesia/komikindoco/src/KomikindoCo.kt b/multisrc/overrides/mangathemesia/komikindoco/src/KomikindoCo.kt
index 9a6c96240e..1744757e7e 100644
--- a/multisrc/overrides/mangathemesia/komikindoco/src/KomikindoCo.kt
+++ b/multisrc/overrides/mangathemesia/komikindoco/src/KomikindoCo.kt
@@ -5,15 +5,12 @@ import eu.kanade.tachiyomi.network.interceptor.rateLimit
import okhttp3.OkHttpClient
import java.text.SimpleDateFormat
import java.util.Locale
-import java.util.concurrent.TimeUnit
class KomikindoCo : MangaThemesia("KomikIndo.co", "https://komikindo.co", "id", dateFormat = SimpleDateFormat("MMM dd, yyyy", Locale("id"))) {
// Formerly "Komikindo.co"
override val id = 734619124437406170
- override val client: OkHttpClient = network.cloudflareClient.newBuilder()
- .connectTimeout(10, TimeUnit.SECONDS)
- .readTimeout(30, TimeUnit.SECONDS)
+ override val client: OkHttpClient = super.client.newBuilder()
.rateLimit(4)
.build()
diff --git a/multisrc/overrides/mangathemesia/komiklab/src/KomikLabFactory.kt b/multisrc/overrides/mangathemesia/komiklab/src/KomikLabFactory.kt
deleted file mode 100644
index 5382a21bb9..0000000000
--- a/multisrc/overrides/mangathemesia/komiklab/src/KomikLabFactory.kt
+++ /dev/null
@@ -1,19 +0,0 @@
-package eu.kanade.tachiyomi.extension.all.komiklab
-
-import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
-import eu.kanade.tachiyomi.source.SourceFactory
-
-class KomikLabFactory : SourceFactory {
- override fun createSources() = listOf(
- KomikLabEn(),
- KomikLabId(),
- )
-}
-
-class KomikLabEn : MangaThemesia("KomikLab Scans", "https://komiklab.com", "en")
-
-class KomikLabId : MangaThemesia("Komik Lab", "https://komiklab.net", "id") {
- override val hasProjectPage = true
-
- override val seriesDetailsSelector = ".seriestucon"
-}
diff --git a/multisrc/overrides/mangathemesia/komikmanhwa/src/KomikManhwa.kt b/multisrc/overrides/mangathemesia/komikmanhwa/src/KomikManhwa.kt
index 65105ec823..bfd0fc6e17 100644
--- a/multisrc/overrides/mangathemesia/komikmanhwa/src/KomikManhwa.kt
+++ b/multisrc/overrides/mangathemesia/komikmanhwa/src/KomikManhwa.kt
@@ -3,12 +3,9 @@ package eu.kanade.tachiyomi.extension.id.komikmanhwa
import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
import eu.kanade.tachiyomi.network.interceptor.rateLimit
import okhttp3.OkHttpClient
-import java.util.concurrent.TimeUnit
class KomikManhwa : MangaThemesia("KomikManhwa", "https://komikmanhwa.me", "id", "/series") {
- override val client: OkHttpClient = network.cloudflareClient.newBuilder()
- .connectTimeout(10, TimeUnit.SECONDS)
- .readTimeout(30, TimeUnit.SECONDS)
+ override val client: OkHttpClient = super.client.newBuilder()
.rateLimit(4)
.build()
}
diff --git a/multisrc/overrides/mangathemesia/komiksan/src/Komiksan.kt b/multisrc/overrides/mangathemesia/komiksan/src/Komiksan.kt
new file mode 100644
index 0000000000..af81466498
--- /dev/null
+++ b/multisrc/overrides/mangathemesia/komiksan/src/Komiksan.kt
@@ -0,0 +1,16 @@
+package eu.kanade.tachiyomi.extension.id.komiksan
+
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+import eu.kanade.tachiyomi.network.interceptor.rateLimit
+import okhttp3.OkHttpClient
+import org.jsoup.nodes.Document
+
+class Komiksan : MangaThemesia("Komiksan", "https://komiksan.link", "id", "/list") {
+ override val client: OkHttpClient = super.client.newBuilder()
+ .rateLimit(4)
+ .build()
+
+ override fun mangaDetailsParse(document: Document) = super.mangaDetailsParse(document).apply {
+ title = document.selectFirst(seriesThumbnailSelector)!!.attr("alt")
+ }
+}
diff --git a/multisrc/overrides/mangathemesia/komikstation/src/KomikStation.kt b/multisrc/overrides/mangathemesia/komikstation/src/KomikStation.kt
index 51437f642a..c7b912d122 100644
--- a/multisrc/overrides/mangathemesia/komikstation/src/KomikStation.kt
+++ b/multisrc/overrides/mangathemesia/komikstation/src/KomikStation.kt
@@ -2,19 +2,31 @@ package eu.kanade.tachiyomi.extension.id.komikstation
import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
import eu.kanade.tachiyomi.network.interceptor.rateLimit
+import eu.kanade.tachiyomi.source.model.SManga
import okhttp3.OkHttpClient
-import java.util.concurrent.TimeUnit
class KomikStation : MangaThemesia("Komik Station", "https://komikstation.co", "id") {
// Formerly "Komik Station (WP Manga Stream)"
override val id = 6148605743576635261
- override val client: OkHttpClient = network.cloudflareClient.newBuilder()
- .connectTimeout(10, TimeUnit.SECONDS)
- .readTimeout(30, TimeUnit.SECONDS)
+ override val client: OkHttpClient = super.client.newBuilder()
.rateLimit(4)
.build()
+ override val seriesTitleSelector = ".ts-breadcrumb li[itemprop]:last-child span"
+ override val seriesAuthorSelector = ".infox .fmed:has(.fa-pen-fancy) span"
+ override val seriesArtistSelector = ".infox .fmed:has(.fa-paintbrush) span"
+ override val seriesTypeSelector = ".tsinfo .imptdt:has(a[href*=\"type\"]) a"
+ override val seriesStatusSelector = ".tsinfo .imptdt:first-child i"
+
+ override fun String?.parseStatus(): Int = when {
+ this == null -> SManga.UNKNOWN
+ listOf("ongoing", "berjalan").any { this.contains(it, ignoreCase = true) } -> SManga.ONGOING
+ this.contains("hiatus", ignoreCase = true) -> SManga.ON_HIATUS
+ this.contains("tamat", ignoreCase = true) -> SManga.COMPLETED
+ else -> SManga.UNKNOWN
+ }
+
override val projectPageString = "/project-list"
override val hasProjectPage = true
diff --git a/multisrc/overrides/mangathemesia/kumapoi/src/KumaPoi.kt b/multisrc/overrides/mangathemesia/kumapoi/src/KumaPoi.kt
index 316d091b76..795a2d03e1 100644
--- a/multisrc/overrides/mangathemesia/kumapoi/src/KumaPoi.kt
+++ b/multisrc/overrides/mangathemesia/kumapoi/src/KumaPoi.kt
@@ -3,12 +3,9 @@ package eu.kanade.tachiyomi.extension.id.kumapoi
import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
import eu.kanade.tachiyomi.network.interceptor.rateLimit
import okhttp3.OkHttpClient
-import java.util.concurrent.TimeUnit
-class KumaPoi : MangaThemesia("KumaPoi", "https://kumapoi.club", "id") {
- override val client: OkHttpClient = network.cloudflareClient.newBuilder()
- .connectTimeout(10, TimeUnit.SECONDS)
- .readTimeout(30, TimeUnit.SECONDS)
+class KumaPoi : MangaThemesia("KumaPoi", "https://kumapoi.info", "id") {
+ override val client: OkHttpClient = super.client.newBuilder()
.rateLimit(4)
.build()
diff --git a/multisrc/overrides/mangathemesia/kumascans/src/KumaScans.kt b/multisrc/overrides/mangathemesia/kumascans/src/KumaScans.kt
index 4a0bde5802..2c2bdf41ce 100644
--- a/multisrc/overrides/mangathemesia/kumascans/src/KumaScans.kt
+++ b/multisrc/overrides/mangathemesia/kumascans/src/KumaScans.kt
@@ -3,13 +3,10 @@ package eu.kanade.tachiyomi.extension.en.kumascans
import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
import eu.kanade.tachiyomi.network.interceptor.rateLimit
import okhttp3.OkHttpClient
-import java.util.concurrent.TimeUnit
class KumaScans : MangaThemesia("Kuma Scans (Kuma Translation)", "https://kumascans.com", "en") {
- override val client: OkHttpClient = network.cloudflareClient.newBuilder()
- .connectTimeout(10, TimeUnit.SECONDS)
- .readTimeout(30, TimeUnit.SECONDS)
+ override val client: OkHttpClient = super.client.newBuilder()
.rateLimit(4)
.build()
diff --git a/multisrc/overrides/mangathemesia/lelmanga/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/lelmanga/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..f6b98f6f3e
Binary files /dev/null and b/multisrc/overrides/mangathemesia/lelmanga/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/lelmanga/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/lelmanga/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..114e338101
Binary files /dev/null and b/multisrc/overrides/mangathemesia/lelmanga/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/lelmanga/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/lelmanga/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..9b2d22544e
Binary files /dev/null and b/multisrc/overrides/mangathemesia/lelmanga/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/lelmanga/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/lelmanga/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..d0c92d4d9a
Binary files /dev/null and b/multisrc/overrides/mangathemesia/lelmanga/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/lelmanga/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/lelmanga/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..ffe56d3656
Binary files /dev/null and b/multisrc/overrides/mangathemesia/lelmanga/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/lelmanga/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/lelmanga/res/web_hi_res_512.png
new file mode 100644
index 0000000000..e5a6e78529
Binary files /dev/null and b/multisrc/overrides/mangathemesia/lelmanga/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/mangathemesia/lelmanga/src/Lelmanga.kt b/multisrc/overrides/mangathemesia/lelmanga/src/Lelmanga.kt
new file mode 100644
index 0000000000..7e0ca7deef
--- /dev/null
+++ b/multisrc/overrides/mangathemesia/lelmanga/src/Lelmanga.kt
@@ -0,0 +1,11 @@
+package eu.kanade.tachiyomi.extension.fr.lelmanga
+
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+import java.text.SimpleDateFormat
+import java.util.Locale
+
+class Lelmanga : MangaThemesia("Lelmanga", "https://lelmanga.com", "fr", dateFormat = SimpleDateFormat("MMMM d, yyyy", Locale.ENGLISH)) {
+ override val altNamePrefix = "Nom alternatif: "
+ override val seriesAuthorSelector = ".imptdt:contains(Auteur) i"
+ override val seriesArtistSelector = ".imptdt:contains(Artiste) i"
+}
diff --git a/multisrc/overrides/mangathemesia/lianscans/src/LianScans.kt b/multisrc/overrides/mangathemesia/lianscans/src/LianScans.kt
index 3b6a2a1198..7bdb98e228 100644
--- a/multisrc/overrides/mangathemesia/lianscans/src/LianScans.kt
+++ b/multisrc/overrides/mangathemesia/lianscans/src/LianScans.kt
@@ -3,13 +3,10 @@ package eu.kanade.tachiyomi.extension.id.lianscans
import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
import eu.kanade.tachiyomi.network.interceptor.rateLimit
import okhttp3.OkHttpClient
-import java.util.concurrent.TimeUnit
class LianScans : MangaThemesia("LianScans", "https://www.lianscans.my.id", "id") {
- override val client: OkHttpClient = network.cloudflareClient.newBuilder()
- .connectTimeout(10, TimeUnit.SECONDS)
- .readTimeout(30, TimeUnit.SECONDS)
+ override val client: OkHttpClient = super.client.newBuilder()
.rateLimit(4)
.build()
diff --git a/multisrc/overrides/mangathemesia/lunarscans/src/LunarScans.kt b/multisrc/overrides/mangathemesia/lunarscans/src/LunarScans.kt
index e2f4e9b503..6290d30913 100644
--- a/multisrc/overrides/mangathemesia/lunarscans/src/LunarScans.kt
+++ b/multisrc/overrides/mangathemesia/lunarscans/src/LunarScans.kt
@@ -21,9 +21,6 @@ class LunarScans : MangaThemesia(
.rateLimit(1)
.build()
- override fun headersBuilder() = super.headersBuilder()
- .add("Referer", "$baseUrl/")
-
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
return if (query.isEmpty()) {
super.searchMangaRequest(page, query, filters)
@@ -61,7 +58,7 @@ class LunarScans : MangaThemesia(
val jsonString = scriptContent.substringAfter("ts_reader.run(").substringBefore(");")
val tsReader = json.decodeFromString(jsonString)
val imageUrls = tsReader.sources.firstOrNull()?.images ?: return emptyList()
- return imageUrls.mapIndexed { index, imageUrl -> Page(index, imageUrl = imageUrl) }
+ return imageUrls.mapIndexed { index, imageUrl -> Page(index, document.location(), imageUrl) }
}
@Serializable
diff --git a/multisrc/overrides/mangathemesia/lynxscans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/lynxscans/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..51faf999b2
Binary files /dev/null and b/multisrc/overrides/mangathemesia/lynxscans/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/lynxscans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/lynxscans/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..50a5fb1e24
Binary files /dev/null and b/multisrc/overrides/mangathemesia/lynxscans/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/lynxscans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/lynxscans/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..6f0cf0b3c4
Binary files /dev/null and b/multisrc/overrides/mangathemesia/lynxscans/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/lynxscans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/lynxscans/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..ea55342e70
Binary files /dev/null and b/multisrc/overrides/mangathemesia/lynxscans/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/lynxscans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/lynxscans/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..bab441b497
Binary files /dev/null and b/multisrc/overrides/mangathemesia/lynxscans/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/lynxscans/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/lynxscans/res/web_hi_res_512.png
new file mode 100644
index 0000000000..3a35efa06c
Binary files /dev/null and b/multisrc/overrides/mangathemesia/lynxscans/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/mangathemesia/lynxscans/src/LynxScans.kt b/multisrc/overrides/mangathemesia/lynxscans/src/LynxScans.kt
new file mode 100644
index 0000000000..9fb2156a66
--- /dev/null
+++ b/multisrc/overrides/mangathemesia/lynxscans/src/LynxScans.kt
@@ -0,0 +1,34 @@
+package eu.kanade.tachiyomi.extension.en.lynxscans
+
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+import eu.kanade.tachiyomi.network.interceptor.rateLimit
+import okhttp3.Interceptor
+import okhttp3.Response
+
+class LynxScans : MangaThemesia("LynxScans", "https://lynxscans.com", "en", "/comics") {
+ override val versionId = 3
+ override val hasProjectPage = true
+
+ override val client = super.client.newBuilder()
+ .addNetworkInterceptor(::pageSpeedRedirectIntercept)
+ .rateLimit(2)
+ .build()
+
+ private fun pageSpeedRedirectIntercept(chain: Interceptor.Chain): Response {
+ val request = chain.request()
+
+ if (request.url.pathSegments.contains("wp-content") || request.method == "POST") {
+ return chain.proceed(request)
+ }
+
+ val newUrl = request.url.newBuilder()
+ .setQueryParameter("PageSpeed", "noscript")
+ .build()
+
+ val newRequest = request.newBuilder()
+ .url(newUrl)
+ .build()
+
+ return chain.proceed(newRequest)
+ }
+}
diff --git a/multisrc/overrides/mangathemesia/lyrascans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/lyrascans/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..b80b5f2e80
Binary files /dev/null and b/multisrc/overrides/mangathemesia/lyrascans/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/lyrascans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/lyrascans/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..980c300f62
Binary files /dev/null and b/multisrc/overrides/mangathemesia/lyrascans/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/lyrascans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/lyrascans/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..07c1996137
Binary files /dev/null and b/multisrc/overrides/mangathemesia/lyrascans/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/lyrascans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/lyrascans/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..c88e4d13f9
Binary files /dev/null and b/multisrc/overrides/mangathemesia/lyrascans/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/lyrascans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/lyrascans/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..ed602bac79
Binary files /dev/null and b/multisrc/overrides/mangathemesia/lyrascans/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/lyrascans/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/lyrascans/res/web_hi_res_512.png
new file mode 100644
index 0000000000..8f080717f8
Binary files /dev/null and b/multisrc/overrides/mangathemesia/lyrascans/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/mangathemesia/lyrascans/src/LyraScans.kt b/multisrc/overrides/mangathemesia/lyrascans/src/LyraScans.kt
new file mode 100644
index 0000000000..9ae916eb8f
--- /dev/null
+++ b/multisrc/overrides/mangathemesia/lyrascans/src/LyraScans.kt
@@ -0,0 +1,12 @@
+package eu.kanade.tachiyomi.extension.en.lyrascans
+
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+import eu.kanade.tachiyomi.network.interceptor.rateLimit
+import okhttp3.OkHttpClient
+
+class LyraScans : MangaThemesia("Lyra Scans", "https://lyrascans.com", "en") {
+
+ override val client: OkHttpClient = super.client.newBuilder()
+ .rateLimit(20, 5)
+ .build()
+}
diff --git a/multisrc/overrides/mangathemesia/magusmanga/src/MagusManga.kt b/multisrc/overrides/mangathemesia/magusmanga/src/MagusManga.kt
index 2c7f38e543..e67189dfa7 100644
--- a/multisrc/overrides/mangathemesia/magusmanga/src/MagusManga.kt
+++ b/multisrc/overrides/mangathemesia/magusmanga/src/MagusManga.kt
@@ -1,7 +1,20 @@
-package eu.kanade.tachiyomi.extension.ar.magusmanga
+package eu.kanade.tachiyomi.extension.en.magusmanga
import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+import eu.kanade.tachiyomi.network.interceptor.rateLimit
import java.text.SimpleDateFormat
import java.util.Locale
+import java.util.concurrent.TimeUnit
-class MagusManga : MangaThemesia("Magus Manga", "https://magusmanga.com", "ar", dateFormat = SimpleDateFormat("MMMMM dd, yyyy", Locale("ar")))
+class MagusManga : MangaThemesia(
+ "Magus Manga",
+ "https://magusmanga.com",
+ "en",
+ dateFormat = SimpleDateFormat("MMMMM dd, yyyy", Locale("en")),
+) {
+ override val id = 7792477462646075400
+
+ override val client = super.client.newBuilder()
+ .rateLimit(1, 1, TimeUnit.SECONDS)
+ .build()
+}
diff --git a/multisrc/overrides/mangathemesia/mangakita/src/MangaKita.kt b/multisrc/overrides/mangathemesia/mangakita/src/MangaKita.kt
index 5b26a5b24b..492311c005 100644
--- a/multisrc/overrides/mangathemesia/mangakita/src/MangaKita.kt
+++ b/multisrc/overrides/mangathemesia/mangakita/src/MangaKita.kt
@@ -2,6 +2,6 @@ package eu.kanade.tachiyomi.extension.id.mangakita
import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
-class MangaKita : MangaThemesia("MangaKita", "https://mangakita.net", "id") {
+class MangaKita : MangaThemesia("MangaKita", "https://mangakita.id", "id") {
override val hasProjectPage = true
}
diff --git a/multisrc/overrides/mangathemesia/mangakyo/src/Mangakyo.kt b/multisrc/overrides/mangathemesia/mangakyo/src/Mangakyo.kt
index 1bf4ea3d8c..ee9de6b8e8 100644
--- a/multisrc/overrides/mangathemesia/mangakyo/src/Mangakyo.kt
+++ b/multisrc/overrides/mangathemesia/mangakyo/src/Mangakyo.kt
@@ -3,16 +3,22 @@ package eu.kanade.tachiyomi.extension.id.mangakyo
import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
import eu.kanade.tachiyomi.network.interceptor.rateLimit
import okhttp3.OkHttpClient
-import java.util.concurrent.TimeUnit
+import java.text.SimpleDateFormat
+import java.util.Locale
-class Mangakyo : MangaThemesia("Mangakyo", "https://mangakyo.id", "id") {
+class Mangakyo : MangaThemesia(
+ "Mangakyo",
+ "https://mangakyo.org",
+ "id",
+ "/komik",
+ SimpleDateFormat("MMM d, yyyy", Locale("id")),
+) {
- override val client: OkHttpClient = network.cloudflareClient.newBuilder()
- .connectTimeout(10, TimeUnit.SECONDS)
- .readTimeout(30, TimeUnit.SECONDS)
+ override val client: OkHttpClient = super.client.newBuilder()
.rateLimit(4)
.build()
+ override val seriesTitleSelector = ".ts-breadcrumb li:last-child span"
override val seriesAuthorSelector = ".infotable tr:contains(Pengarang) td:last-child"
override val seriesDescriptionSelector = ".entry-content[itemprop=description] p:not(:contains(melapor ke fanspage))"
override val seriesAltNameSelector = ".infotable tr:contains(Alternatif) td:last-child"
diff --git a/multisrc/overrides/mangathemesia/mangaraworg/src/MangaRawOrg.kt b/multisrc/overrides/mangathemesia/mangaraworg/src/MangaRawOrg.kt
index 224359a25b..4cfed65b60 100644
--- a/multisrc/overrides/mangathemesia/mangaraworg/src/MangaRawOrg.kt
+++ b/multisrc/overrides/mangathemesia/mangaraworg/src/MangaRawOrg.kt
@@ -15,14 +15,11 @@ import okhttp3.Response
import org.jsoup.nodes.Document
import org.jsoup.nodes.Element
import rx.Observable
-import java.util.concurrent.TimeUnit
class MangaRawOrg : MangaThemesia("Manga Raw.org", "https://mangaraw.org", "ja") {
override val id = 6223520752496636410
- override val client: OkHttpClient = network.cloudflareClient.newBuilder()
- .connectTimeout(10, TimeUnit.SECONDS)
- .readTimeout(30, TimeUnit.SECONDS)
+ override val client: OkHttpClient = super.client.newBuilder()
.rateLimit(4)
.build()
diff --git a/multisrc/overrides/mangathemesia/mangaschan/src/MangasChan.kt b/multisrc/overrides/mangathemesia/mangaschan/src/MangasChan.kt
index ebbeed5989..76620649fc 100644
--- a/multisrc/overrides/mangathemesia/mangaschan/src/MangasChan.kt
+++ b/multisrc/overrides/mangathemesia/mangaschan/src/MangasChan.kt
@@ -7,17 +7,17 @@ import java.util.Locale
class MangasChan : MangaThemesia(
"Mangás Chan",
- "https://mangaschan.com",
+ "https://mangaschan.net",
"pt-BR",
dateFormat = SimpleDateFormat("MMMMM dd, yyyy", Locale("pt", "BR")),
) {
- override val client: OkHttpClient = network.cloudflareClient.newBuilder()
+ override val client: OkHttpClient = super.client.newBuilder()
.build()
override val altNamePrefix = "Nomes alternativos: "
- override val seriesArtistSelector = ".infotable tr:contains(Artista) td:last-child"
- override val seriesAuthorSelector = ".infotable tr:contains(Autor) td:last-child"
- override val seriesTypeSelector = ".infotable tr:contains(Tipo) td:last-child"
+ override val seriesArtistSelector = ".tsinfo .imptdt:contains(Artista) > i"
+ override val seriesAuthorSelector = ".tsinfo .imptdt:contains(Autor) > i"
+ override val seriesTypeSelector = ".tsinfo .imptdt:contains(Tipo) > a"
}
diff --git a/multisrc/overrides/mangathemesia/mangashiina/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/mangashiina/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..0bde288891
Binary files /dev/null and b/multisrc/overrides/mangathemesia/mangashiina/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/mangashiina/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/mangashiina/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..ce8507766c
Binary files /dev/null and b/multisrc/overrides/mangathemesia/mangashiina/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/mangashiina/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/mangashiina/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..dd2d028201
Binary files /dev/null and b/multisrc/overrides/mangathemesia/mangashiina/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/mangashiina/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/mangashiina/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..b710dfa1fc
Binary files /dev/null and b/multisrc/overrides/mangathemesia/mangashiina/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/mangashiina/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/mangashiina/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..d00e6a4a84
Binary files /dev/null and b/multisrc/overrides/mangathemesia/mangashiina/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/mangashiina/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/mangashiina/res/web_hi_res_512.png
new file mode 100644
index 0000000000..8411e149d8
Binary files /dev/null and b/multisrc/overrides/mangathemesia/mangashiina/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/mangathemesia/mangashiina/src/MangaShiina.kt b/multisrc/overrides/mangathemesia/mangashiina/src/MangaShiina.kt
new file mode 100644
index 0000000000..87d66ff089
--- /dev/null
+++ b/multisrc/overrides/mangathemesia/mangashiina/src/MangaShiina.kt
@@ -0,0 +1,12 @@
+package eu.kanade.tachiyomi.extension.es.mangashiina
+
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+import java.text.SimpleDateFormat
+import java.util.Locale
+
+class MangaShiina : MangaThemesia(
+ "MangaShiina",
+ "https://mangashiina.com",
+ "es",
+ dateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale("es")),
+)
diff --git a/multisrc/overrides/mangathemesia/mangashiro/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/mangashiro/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..30cfe4fe64
Binary files /dev/null and b/multisrc/overrides/mangathemesia/mangashiro/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/mangashiro/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/mangashiro/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..db5c9d51da
Binary files /dev/null and b/multisrc/overrides/mangathemesia/mangashiro/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/mangashiro/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/mangashiro/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..7ee214e90c
Binary files /dev/null and b/multisrc/overrides/mangathemesia/mangashiro/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/mangashiro/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/mangashiro/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..b25b2bbe21
Binary files /dev/null and b/multisrc/overrides/mangathemesia/mangashiro/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/mangashiro/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/mangashiro/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..9b096fb2e5
Binary files /dev/null and b/multisrc/overrides/mangathemesia/mangashiro/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/mangashiro/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/mangashiro/res/web_hi_res_512.png
new file mode 100644
index 0000000000..3328f3aa36
Binary files /dev/null and b/multisrc/overrides/mangathemesia/mangashiro/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/mangathemesia/mangashiro/src/MangaShiro.kt b/multisrc/overrides/mangathemesia/mangashiro/src/MangaShiro.kt
new file mode 100644
index 0000000000..ffa761ec23
--- /dev/null
+++ b/multisrc/overrides/mangathemesia/mangashiro/src/MangaShiro.kt
@@ -0,0 +1,19 @@
+package eu.kanade.tachiyomi.extension.id.mangashiro
+
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+import eu.kanade.tachiyomi.network.interceptor.rateLimit
+import okhttp3.OkHttpClient
+import java.util.concurrent.TimeUnit
+
+class MangaShiro : MangaThemesia("MangaShiro", "https://mangashiro.me", "id") {
+
+ override val client: OkHttpClient = super.client.newBuilder()
+ .rateLimit(20, 5, TimeUnit.SECONDS)
+ .build()
+
+ override val hasProjectPage = true
+
+ override val projectPageString = "/project-manga"
+
+ override val seriesTitleSelector = ".ts-breadcrumb li:last-child span"
+}
diff --git a/multisrc/overrides/mangathemesia/mangaswat/src/MangaSwat.kt b/multisrc/overrides/mangathemesia/mangaswat/src/MangaSwat.kt
index 220816e7e4..e53a9094ec 100644
--- a/multisrc/overrides/mangathemesia/mangaswat/src/MangaSwat.kt
+++ b/multisrc/overrides/mangathemesia/mangaswat/src/MangaSwat.kt
@@ -7,12 +7,15 @@ import androidx.preference.PreferenceScreen
import eu.kanade.tachiyomi.extension.BuildConfig
import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
import eu.kanade.tachiyomi.network.interceptor.rateLimit
+import eu.kanade.tachiyomi.source.model.FilterList
import eu.kanade.tachiyomi.source.model.Page
+import eu.kanade.tachiyomi.source.model.SChapter
import kotlinx.serialization.Serializable
import kotlinx.serialization.decodeFromString
-import okhttp3.Headers
import okhttp3.OkHttpClient
+import okhttp3.Request
import org.jsoup.nodes.Document
+import org.jsoup.nodes.Element
import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
import java.text.SimpleDateFormat
@@ -20,11 +23,11 @@ import java.util.Locale
class MangaSwat : MangaThemesia(
"MangaSwat",
- "https://swatmanga.me",
+ "https://goldragon.me",
"ar",
- dateFormat = SimpleDateFormat("yyyy-MM-dd", Locale.US),
+ dateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale("ar")),
) {
- private val defaultBaseUrl = "https://swatmanga.me"
+ private val defaultBaseUrl = "https://goldragon.me"
override val baseUrl by lazy { getPrefBaseUrl() }
@@ -36,8 +39,22 @@ class MangaSwat : MangaThemesia(
.rateLimit(1)
.build()
- override fun headersBuilder(): Headers.Builder = super.headersBuilder()
- .add("Referer", "$baseUrl/")
+ override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
+ val request = super.searchMangaRequest(page, query, filters)
+ if (query.isBlank()) return request
+
+ val url = request.url.newBuilder()
+ .removePathSegment(0)
+ .removeAllQueryParameters("title")
+ .addQueryParameter("s", query)
+ .build()
+
+ return request.newBuilder()
+ .url(url)
+ .build()
+ }
+
+ override fun searchMangaNextPageSelector() = "a[rel=next]"
override val seriesArtistSelector = "span:contains(الناشر) i"
override val seriesAuthorSelector = "span:contains(المؤلف) i"
@@ -50,11 +67,18 @@ class MangaSwat : MangaThemesia(
val jsonString = scriptContent.substringAfter("ts_reader.run(").substringBefore(");")
val tsReader = json.decodeFromString(jsonString)
val imageUrls = tsReader.sources.firstOrNull()?.images ?: return emptyList()
- return imageUrls.mapIndexed { index, imageUrl -> Page(index, imageUrl = imageUrl) }
+ return imageUrls.mapIndexed { index, imageUrl -> Page(index, document.location(), imageUrl) }
}
override fun chapterListSelector() = "div.bxcl li, ul div:has(span.lchx)"
+ override fun chapterFromElement(element: Element) = SChapter.create().apply {
+ val urlElements = element.select("a")
+ setUrlWithoutDomain(urlElements.attr("href"))
+ name = element.select(".lch a, .chapternum").text().ifBlank { urlElements.last()!!.text() }
+ date_upload = element.selectFirst(".chapter-date")?.text().parseChapterDate()
+ }
+
@Serializable
data class TSReader(
val sources: List,
diff --git a/multisrc/overrides/mangathemesia/mangatale/src/MangaTale.kt b/multisrc/overrides/mangathemesia/mangatale/src/MangaTale.kt
new file mode 100644
index 0000000000..56b0a9cfc6
--- /dev/null
+++ b/multisrc/overrides/mangathemesia/mangatale/src/MangaTale.kt
@@ -0,0 +1,14 @@
+package eu.kanade.tachiyomi.extension.id.mangatale
+
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+import eu.kanade.tachiyomi.network.interceptor.rateLimit
+import okhttp3.OkHttpClient
+
+class MangaTale : MangaThemesia("MangaTale", "https://mangatale.co", "id") {
+
+ override val client: OkHttpClient = super.client.newBuilder()
+ .rateLimit(20, 5)
+ .build()
+
+ override val seriesTitleSelector = ".ts-breadcrumb li:last-child span"
+}
diff --git a/multisrc/overrides/mangathemesia/mangayaro/src/Mangayaro.kt b/multisrc/overrides/mangathemesia/mangayaro/src/Mangayaro.kt
index 34fd4e1586..912e2c6609 100644
--- a/multisrc/overrides/mangathemesia/mangayaro/src/Mangayaro.kt
+++ b/multisrc/overrides/mangathemesia/mangayaro/src/Mangayaro.kt
@@ -3,13 +3,12 @@ package eu.kanade.tachiyomi.extension.id.mangayaro
import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
import eu.kanade.tachiyomi.network.interceptor.rateLimit
import okhttp3.OkHttpClient
-import java.util.concurrent.TimeUnit
-class Mangayaro : MangaThemesia("Mangayaro", "https://mangayaro.net", "id") {
+class Mangayaro : MangaThemesia("Mangayaro", "https://www.mangayaro.id", "id") {
- override val client: OkHttpClient = network.cloudflareClient.newBuilder()
- .connectTimeout(10, TimeUnit.SECONDS)
- .readTimeout(30, TimeUnit.SECONDS)
+ override val client: OkHttpClient = super.client.newBuilder()
.rateLimit(4)
.build()
+
+ override val seriesAuthorSelector = ".tsinfo .imptdt:contains(seniman) i"
}
diff --git a/multisrc/overrides/mangathemesia/mangceh/src/Mareceh.kt b/multisrc/overrides/mangathemesia/mangceh/src/Mareceh.kt
index 891845d19d..8af8604347 100644
--- a/multisrc/overrides/mangathemesia/mangceh/src/Mareceh.kt
+++ b/multisrc/overrides/mangathemesia/mangceh/src/Mareceh.kt
@@ -3,15 +3,12 @@ package eu.kanade.tachiyomi.extension.id.mangceh
import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
import eu.kanade.tachiyomi.network.interceptor.rateLimit
import okhttp3.OkHttpClient
-import java.util.concurrent.TimeUnit
class Mareceh : MangaThemesia("Mareceh", "https://mareceh.com", "id") {
override val versionId = 2
- override val client: OkHttpClient = network.cloudflareClient.newBuilder()
- .connectTimeout(10, TimeUnit.SECONDS)
- .readTimeout(30, TimeUnit.SECONDS)
+ override val client: OkHttpClient = super.client.newBuilder()
.rateLimit(4)
.build()
diff --git a/multisrc/overrides/mangathemesia/mangkomik/src/MangKomik.kt b/multisrc/overrides/mangathemesia/mangkomik/src/MangKomik.kt
index 29181369d2..69f450d716 100644
--- a/multisrc/overrides/mangathemesia/mangkomik/src/MangKomik.kt
+++ b/multisrc/overrides/mangathemesia/mangkomik/src/MangKomik.kt
@@ -5,12 +5,14 @@ import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.source.model.Page
import org.jsoup.nodes.Document
-class MangKomik : MangaThemesia("MangKomik", "https://mangkomik.net", "id") {
+class MangKomik : MangaThemesia("Siren Komik", "https://sirenkomik.my.id", "id") {
+ override val id = 8457447675410081142
+
override val hasProjectPage = true
override fun pageListParse(document: Document): List {
// Get external JS for image urls
- val scriptEl = document.selectFirst("script[data-minify]")!!
+ val scriptEl = document.selectFirst("script[data-minify]")
val scriptUrl = scriptEl?.attr("src")
if (scriptUrl.isNullOrEmpty()) {
return super.pageListParse(document)
diff --git a/multisrc/overrides/mangathemesia/manhwadesu/src/ManhwaDesu.kt b/multisrc/overrides/mangathemesia/manhwadesu/src/ManhwaDesu.kt
index 56c0de2750..13ec37cbf3 100644
--- a/multisrc/overrides/mangathemesia/manhwadesu/src/ManhwaDesu.kt
+++ b/multisrc/overrides/mangathemesia/manhwadesu/src/ManhwaDesu.kt
@@ -3,13 +3,23 @@ package eu.kanade.tachiyomi.extension.id.manhwadesu
import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
import eu.kanade.tachiyomi.network.interceptor.rateLimit
import okhttp3.OkHttpClient
-import java.util.concurrent.TimeUnit
+import org.jsoup.nodes.Element
-class ManhwaDesu : MangaThemesia("ManhwaDesu", "https://manhwadesu.org", "id", "/komik") {
+class ManhwaDesu : MangaThemesia("ManhwaDesu", "https://manhwadesu.one", "id", "/komik") {
- override val client: OkHttpClient = network.cloudflareClient.newBuilder()
- .connectTimeout(10, TimeUnit.SECONDS)
- .readTimeout(30, TimeUnit.SECONDS)
+ override val client: OkHttpClient = super.client.newBuilder()
.rateLimit(4)
.build()
+
+ override fun Element.imgAttr(): String {
+ attributes()
+ .find { it.key.endsWith("original-src") }
+ ?.let { return absUrl(it.key) }
+
+ return when {
+ hasAttr("data-lazy-src") -> attr("abs:data-lazy-src")
+ hasAttr("data-src") -> attr("abs:data-src")
+ else -> attr("abs:src")
+ }
+ }
}
diff --git a/multisrc/overrides/mangathemesia/manhwafreak/src/ManhwaFreak.kt b/multisrc/overrides/mangathemesia/manhwafreak/src/ManhwaFreak.kt
index 0ad450efca..8dab850bad 100644
--- a/multisrc/overrides/mangathemesia/manhwafreak/src/ManhwaFreak.kt
+++ b/multisrc/overrides/mangathemesia/manhwafreak/src/ManhwaFreak.kt
@@ -7,8 +7,9 @@ import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga
import okhttp3.Request
import org.jsoup.nodes.Element
+import java.util.Calendar
-class ManhwaFreak : MangaThemesia("Manhwa Freak", "https://manhwafreak.com", "en") {
+class ManhwaFreak : MangaThemesia("Manhwa Freak", "https://manhwa-freak.com", "en") {
// they called the theme "mangareaderfix"
@@ -51,9 +52,34 @@ class ManhwaFreak : MangaThemesia("Manhwa Freak", "https://manhwafreak.com", "en
override fun chapterFromElement(element: Element) = SChapter.create().apply {
val urlElements = element.select("a")
setUrlWithoutDomain(urlElements.attr("href"))
- name = element.select(".chapter-info p:nth-child(1)")!!.text().ifBlank { urlElements.first()!!.text() }
- date_upload = element.selectFirst(".chapter-info p:nth-child(2)")?.text().parseChapterDate()
+ val chapterElements = element.select(".chapter-info")
+ name = chapterElements.select("p:nth-child(1)").text().ifBlank { urlElements.first()!!.text() }
+ date_upload = getChapterDate(chapterElements.first())
}
override fun getFilterList() = FilterList()
+
+ private fun getChapterDate(element: Element?): Long {
+ element ?: return 0
+ val chapterDate = element.select("p:nth-child(2)").text()
+
+ return when {
+ element.select("p.new").isNotEmpty() -> getToday()
+ chapterDate.contains(Regex("day(s)* ago$")) -> {
+ val number = Regex("""(\d+)""").find(chapterDate)?.value?.toIntOrNull() ?: return 0
+ Calendar.getInstance().apply { add(Calendar.DAY_OF_MONTH, -number) }.timeInMillis
+ }
+
+ else -> chapterDate.parseChapterDate()
+ }
+ }
+
+ private fun getToday(): Long {
+ return Calendar.getInstance().apply {
+ set(Calendar.HOUR_OF_DAY, 0)
+ set(Calendar.MINUTE, 0)
+ set(Calendar.SECOND, 0)
+ set(Calendar.MILLISECOND, 0)
+ }.timeInMillis
+ }
}
diff --git a/multisrc/overrides/mangathemesia/manhwafreakfr/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/manhwafreakfr/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..7284178864
Binary files /dev/null and b/multisrc/overrides/mangathemesia/manhwafreakfr/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/manhwafreakfr/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/manhwafreakfr/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..cb1acc5361
Binary files /dev/null and b/multisrc/overrides/mangathemesia/manhwafreakfr/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/manhwafreakfr/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/manhwafreakfr/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..142f451b07
Binary files /dev/null and b/multisrc/overrides/mangathemesia/manhwafreakfr/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/manhwafreakfr/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/manhwafreakfr/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..032e7759b8
Binary files /dev/null and b/multisrc/overrides/mangathemesia/manhwafreakfr/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/manhwafreakfr/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/manhwafreakfr/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..676f90eb69
Binary files /dev/null and b/multisrc/overrides/mangathemesia/manhwafreakfr/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/manhwafreakfr/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/manhwafreakfr/res/web_hi_res_512.png
new file mode 100644
index 0000000000..4d0f594988
Binary files /dev/null and b/multisrc/overrides/mangathemesia/manhwafreakfr/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/mangathemesia/manhwafreakfr/src/ManhwaFreakFR.kt b/multisrc/overrides/mangathemesia/manhwafreakfr/src/ManhwaFreakFR.kt
new file mode 100644
index 0000000000..1662a06417
--- /dev/null
+++ b/multisrc/overrides/mangathemesia/manhwafreakfr/src/ManhwaFreakFR.kt
@@ -0,0 +1,32 @@
+package eu.kanade.tachiyomi.extension.fr.manhwafreakfr
+
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+import eu.kanade.tachiyomi.network.GET
+import eu.kanade.tachiyomi.source.model.FilterList
+import eu.kanade.tachiyomi.source.model.SChapter
+import okhttp3.Request
+import org.jsoup.nodes.Element
+import java.text.SimpleDateFormat
+import java.util.Locale
+
+class ManhwaFreakFR : MangaThemesia("ManhwaFreak", "https://manhwafreak.fr", "fr", dateFormat = SimpleDateFormat("MMMM d, yyyy", Locale.ENGLISH)) {
+ override fun latestUpdatesRequest(page: Int) = GET("$baseUrl/manga/?type=comic", headers)
+
+ override fun popularMangaRequest(page: Int) = GET("$baseUrl/manga/?order=views&type=comic", headers)
+
+ override fun searchMangaSelector() = ".listupd .lastest-serie"
+
+ override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request =
+ GET("$baseUrl/page/$page/?s=$query")
+
+ override fun chapterListSelector() = ".chapter-li a:not(:has(svg))"
+
+ override fun chapterFromElement(element: Element) = SChapter.create().apply {
+ val urlElements = element.select("a")
+ setUrlWithoutDomain(urlElements.attr("href"))
+ name = element.select(".chapter-info p:nth-child(1)").text().ifBlank { urlElements.first()!!.text() }
+ date_upload = element.selectFirst(".chapter-info p:nth-child(2)")?.text().parseChapterDate()
+ }
+
+ override fun getFilterList() = FilterList()
+}
diff --git a/multisrc/overrides/mangathemesia/manhwaindo/src/ManhwaIndo.kt b/multisrc/overrides/mangathemesia/manhwaindo/src/ManhwaIndo.kt
index 365a2d8b56..e70fba3bd1 100644
--- a/multisrc/overrides/mangathemesia/manhwaindo/src/ManhwaIndo.kt
+++ b/multisrc/overrides/mangathemesia/manhwaindo/src/ManhwaIndo.kt
@@ -1,8 +1,6 @@
package eu.kanade.tachiyomi.extension.id.manhwaindo
import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
-import okhttp3.Headers
-import org.jsoup.nodes.Document
import java.text.SimpleDateFormat
import java.util.Locale
@@ -11,15 +9,9 @@ class ManhwaIndo : MangaThemesia(
"https://manhwaindo.id",
"id",
"/series",
- SimpleDateFormat("MMMM dd, yyyy", Locale("id")),
+ SimpleDateFormat("MMMM dd, yyyy", Locale.US),
) {
-
- override fun headersBuilder(): Headers.Builder = Headers.Builder()
- .add("Referer", baseUrl)
-
- override fun mangaDetailsParse(document: Document) = super.mangaDetailsParse(document).apply {
- thumbnail_url = document.select(seriesThumbnailSelector).attr("abs:src")
- }
+ override val seriesTitleSelector = ".ts-breadcrumb li:last-child span"
override val hasProjectPage = true
}
diff --git a/multisrc/overrides/mangathemesia/manhwalandmom/src/ManhwaLandMom.kt b/multisrc/overrides/mangathemesia/manhwalandmom/src/ManhwaLandMom.kt
index fcab463287..a56211ea26 100644
--- a/multisrc/overrides/mangathemesia/manhwalandmom/src/ManhwaLandMom.kt
+++ b/multisrc/overrides/mangathemesia/manhwalandmom/src/ManhwaLandMom.kt
@@ -3,13 +3,17 @@ package eu.kanade.tachiyomi.extension.id.manhwalandmom
import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
import eu.kanade.tachiyomi.network.interceptor.rateLimit
import okhttp3.OkHttpClient
-import java.util.concurrent.TimeUnit
+import java.text.SimpleDateFormat
+import java.util.Locale
-class ManhwaLandMom : MangaThemesia("ManhwaLand.mom", "https://manhwaland.us", "id") {
+class ManhwaLandMom : MangaThemesia(
+ "ManhwaLand.mom",
+ "https://manhwaland.lat",
+ "id",
+ dateFormat = SimpleDateFormat("MMMM d, yyyy", Locale("id")),
+) {
- override val client: OkHttpClient = network.cloudflareClient.newBuilder()
- .connectTimeout(10, TimeUnit.SECONDS)
- .readTimeout(30, TimeUnit.SECONDS)
+ override val client: OkHttpClient = super.client.newBuilder()
.rateLimit(4)
.build()
}
diff --git a/multisrc/overrides/mangathemesia/manhwalist/src/ManhwaList.kt b/multisrc/overrides/mangathemesia/manhwalist/src/ManhwaList.kt
index ba3a8b0888..2534e7fb79 100644
--- a/multisrc/overrides/mangathemesia/manhwalist/src/ManhwaList.kt
+++ b/multisrc/overrides/mangathemesia/manhwalist/src/ManhwaList.kt
@@ -3,13 +3,10 @@ package eu.kanade.tachiyomi.extension.id.manhwalist
import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
import eu.kanade.tachiyomi.network.interceptor.rateLimit
import okhttp3.OkHttpClient
-import java.util.concurrent.TimeUnit
-class ManhwaList : MangaThemesia("ManhwaList", "https://manhwalist.xyz", "id") {
+class ManhwaList : MangaThemesia("ManhwaList", "https://manhwalist.com", "id") {
- override val client: OkHttpClient = network.cloudflareClient.newBuilder()
- .connectTimeout(10, TimeUnit.SECONDS)
- .readTimeout(30, TimeUnit.SECONDS)
+ override val client: OkHttpClient = super.client.newBuilder()
.rateLimit(4)
.build()
diff --git a/multisrc/overrides/mangathemesia/martialmanga/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/martialmanga/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index fb92456c71..0000000000
Binary files a/multisrc/overrides/mangathemesia/martialmanga/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mangathemesia/martialmanga/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/martialmanga/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index 0ef1a91946..0000000000
Binary files a/multisrc/overrides/mangathemesia/martialmanga/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mangathemesia/martialmanga/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/martialmanga/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 3f377b9602..0000000000
Binary files a/multisrc/overrides/mangathemesia/martialmanga/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mangathemesia/martialmanga/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/martialmanga/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 4ac4f7d55f..0000000000
Binary files a/multisrc/overrides/mangathemesia/martialmanga/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mangathemesia/martialmanga/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/martialmanga/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index bcd75b74fb..0000000000
Binary files a/multisrc/overrides/mangathemesia/martialmanga/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mangathemesia/martialmanga/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/martialmanga/res/web_hi_res_512.png
deleted file mode 100644
index 39b2986fc6..0000000000
Binary files a/multisrc/overrides/mangathemesia/martialmanga/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/mangathemesia/masterkomik/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/masterkomik/res/mipmap-hdpi/ic_launcher.png
index 2be925c7d0..4349665cb3 100644
Binary files a/multisrc/overrides/mangathemesia/masterkomik/res/mipmap-hdpi/ic_launcher.png and b/multisrc/overrides/mangathemesia/masterkomik/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/masterkomik/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/masterkomik/res/mipmap-mdpi/ic_launcher.png
index 2da0321045..6fc32d5266 100644
Binary files a/multisrc/overrides/mangathemesia/masterkomik/res/mipmap-mdpi/ic_launcher.png and b/multisrc/overrides/mangathemesia/masterkomik/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/masterkomik/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/masterkomik/res/mipmap-xhdpi/ic_launcher.png
index 8bc21baa3c..6e38f07f76 100644
Binary files a/multisrc/overrides/mangathemesia/masterkomik/res/mipmap-xhdpi/ic_launcher.png and b/multisrc/overrides/mangathemesia/masterkomik/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/masterkomik/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/masterkomik/res/mipmap-xxhdpi/ic_launcher.png
index 9c02b6d375..1cce10d9e7 100644
Binary files a/multisrc/overrides/mangathemesia/masterkomik/res/mipmap-xxhdpi/ic_launcher.png and b/multisrc/overrides/mangathemesia/masterkomik/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/masterkomik/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/masterkomik/res/mipmap-xxxhdpi/ic_launcher.png
index 42b6479b1a..68f9b78612 100644
Binary files a/multisrc/overrides/mangathemesia/masterkomik/res/mipmap-xxxhdpi/ic_launcher.png and b/multisrc/overrides/mangathemesia/masterkomik/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/masterkomik/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/masterkomik/res/web_hi_res_512.png
index bb9dd6dca4..00aaa64cf0 100644
Binary files a/multisrc/overrides/mangathemesia/masterkomik/res/web_hi_res_512.png and b/multisrc/overrides/mangathemesia/masterkomik/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/mangathemesia/masterkomik/src/MasterKomik.kt b/multisrc/overrides/mangathemesia/masterkomik/src/MasterKomik.kt
deleted file mode 100644
index e9082ffb68..0000000000
--- a/multisrc/overrides/mangathemesia/masterkomik/src/MasterKomik.kt
+++ /dev/null
@@ -1,19 +0,0 @@
-package eu.kanade.tachiyomi.extension.id.masterkomik
-
-import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
-import eu.kanade.tachiyomi.network.interceptor.rateLimit
-import okhttp3.OkHttpClient
-import java.util.concurrent.TimeUnit
-
-class MasterKomik : MangaThemesia("MasterKomik", "https://masterkomik.com", "id") {
-
- override val client: OkHttpClient = network.cloudflareClient.newBuilder()
- .connectTimeout(10, TimeUnit.SECONDS)
- .readTimeout(30, TimeUnit.SECONDS)
- .rateLimit(4)
- .build()
-
- override val projectPageString = "/project-list"
-
- override val hasProjectPage = true
-}
diff --git a/multisrc/overrides/mangathemesia/masterkomik/src/TenshiId.kt b/multisrc/overrides/mangathemesia/masterkomik/src/TenshiId.kt
new file mode 100644
index 0000000000..2dcc003d83
--- /dev/null
+++ b/multisrc/overrides/mangathemesia/masterkomik/src/TenshiId.kt
@@ -0,0 +1,30 @@
+package eu.kanade.tachiyomi.extension.id.masterkomik
+
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+import eu.kanade.tachiyomi.network.interceptor.rateLimit
+import okhttp3.OkHttpClient
+import java.text.SimpleDateFormat
+import java.util.Locale
+
+class TenshiId : MangaThemesia(
+ "Tenshi.id",
+ "https://tenshi.id",
+ "id",
+ dateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale("id", "ID")),
+ mangaUrlDirectory = "/komik",
+) {
+
+ // MasterKomik changed to Tenshi.id
+ override val id: Long = 3146720114171452298
+
+ override val seriesArtistSelector: String = ".imptdt-artist-sub-2 i .js-button-custom"
+ override val seriesAuthorSelector: String = ".imptdt-author-sub-2 i .js-button-custom"
+
+ override val client: OkHttpClient = super.client.newBuilder()
+ .rateLimit(4)
+ .build()
+
+ override val projectPageString = "/project-list"
+
+ override val hasProjectPage = true
+}
diff --git a/multisrc/overrides/mangathemesia/miauscan/src/MiauScanFactory.kt b/multisrc/overrides/mangathemesia/miauscan/src/MiauScanFactory.kt
index 1e3d18ae1e..df73599f16 100644
--- a/multisrc/overrides/mangathemesia/miauscan/src/MiauScanFactory.kt
+++ b/multisrc/overrides/mangathemesia/miauscan/src/MiauScanFactory.kt
@@ -13,18 +13,23 @@ import java.util.Locale
class MiauScanFactory : SourceFactory {
override fun createSources() = listOf(
- MiauScan("es", Filter.TriState.STATE_EXCLUDE),
- MiauScan("pt-BR", Filter.TriState.STATE_INCLUDE),
+ MiauScan("es"),
+ MiauScan("pt-BR"),
)
}
-open class MiauScan(lang: String, private val portugueseMode: Int) : MangaThemesia(
+open class MiauScan(lang: String) : MangaThemesia(
name = "Miau Scan",
- baseUrl = "https://miauscan.com",
+ baseUrl = "https://miaucomics.org",
lang = lang,
dateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale("es")),
) {
+ private val portugueseMode =
+ if (lang == "pt-BR") Filter.TriState.STATE_INCLUDE else Filter.TriState.STATE_EXCLUDE
+
+ override val seriesGenreSelector = ".mgen a:not(:contains(Português))"
+
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
val genreFilterIndex = filters.indexOfFirst { it is GenreListFilter }
val genreFilter = filters.getOrNull(genreFilterIndex) as? GenreListFilter
@@ -32,7 +37,7 @@ open class MiauScan(lang: String, private val portugueseMode: Int) : MangaThemes
val overloadedGenreFilter = GenreListFilter(
genres = genreFilter.state + listOf(
- Genre("", PORTUGUESE_GENRE, portugueseMode),
+ Genre("", PORTUGUESE_GENRE_ID, portugueseMode),
),
)
@@ -60,11 +65,11 @@ open class MiauScan(lang: String, private val portugueseMode: Int) : MangaThemes
}
override fun getGenreList(): List {
- return super.getGenreList().filter { it.value != PORTUGUESE_GENRE }
+ return super.getGenreList().filter { it.value != PORTUGUESE_GENRE_ID }
}
companion object {
- const val PORTUGUESE_GENRE = "307"
+ const val PORTUGUESE_GENRE_ID = "307"
val PORTUGUESE_SUFFIX = "^\\(\\s*Portugu[êe]s\\s*\\)\\s*".toRegex(RegexOption.IGNORE_CASE)
}
diff --git a/multisrc/overrides/mangathemesia/miraiscans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/miraiscans/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..ee21522289
Binary files /dev/null and b/multisrc/overrides/mangathemesia/miraiscans/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/miraiscans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/miraiscans/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..ed7202a8a2
Binary files /dev/null and b/multisrc/overrides/mangathemesia/miraiscans/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/miraiscans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/miraiscans/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..e62f45d259
Binary files /dev/null and b/multisrc/overrides/mangathemesia/miraiscans/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/miraiscans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/miraiscans/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..0a3625e14a
Binary files /dev/null and b/multisrc/overrides/mangathemesia/miraiscans/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/miraiscans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/miraiscans/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..98a81093b4
Binary files /dev/null and b/multisrc/overrides/mangathemesia/miraiscans/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/miraiscans/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/miraiscans/res/web_hi_res_512.png
new file mode 100644
index 0000000000..2abfda60b6
Binary files /dev/null and b/multisrc/overrides/mangathemesia/miraiscans/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/mangathemesia/miraiscans/src/MiraiScans.kt b/multisrc/overrides/mangathemesia/miraiscans/src/MiraiScans.kt
new file mode 100644
index 0000000000..ef693deee4
--- /dev/null
+++ b/multisrc/overrides/mangathemesia/miraiscans/src/MiraiScans.kt
@@ -0,0 +1,14 @@
+package eu.kanade.tachiyomi.extension.id.miraiscans
+
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+import eu.kanade.tachiyomi.network.interceptor.rateLimit
+import okhttp3.OkHttpClient
+
+class MiraiScans : MangaThemesia("Mirai Scans", "https://miraiscans.com", "id", mangaUrlDirectory = "/komik") {
+
+ override val hasProjectPage = true
+
+ override val client: OkHttpClient = super.client.newBuilder()
+ .rateLimit(3)
+ .build()
+}
diff --git a/multisrc/overrides/mangathemesia/mirrordesu/src/MirrorDesu.kt b/multisrc/overrides/mangathemesia/mirrordesu/src/MirrorDesu.kt
index c1c007c77f..3703c33a28 100644
--- a/multisrc/overrides/mangathemesia/mirrordesu/src/MirrorDesu.kt
+++ b/multisrc/overrides/mangathemesia/mirrordesu/src/MirrorDesu.kt
@@ -3,12 +3,9 @@ package eu.kanade.tachiyomi.extension.id.mirrordesu
import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
import eu.kanade.tachiyomi.network.interceptor.rateLimit
import okhttp3.OkHttpClient
-import java.util.concurrent.TimeUnit
class MirrorDesu : MangaThemesia("MirrorDesu", "https://mirrordesu.me", "id", "/komik") {
- override val client: OkHttpClient = network.cloudflareClient.newBuilder()
- .connectTimeout(10, TimeUnit.SECONDS)
- .readTimeout(30, TimeUnit.SECONDS)
+ override val client: OkHttpClient = super.client.newBuilder()
.rateLimit(4)
.build()
diff --git a/multisrc/overrides/mangathemesia/modescanlator/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/modescanlator/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index ad6b2180c1..0000000000
Binary files a/multisrc/overrides/mangathemesia/modescanlator/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mangathemesia/modescanlator/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/modescanlator/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index 577303ecf9..0000000000
Binary files a/multisrc/overrides/mangathemesia/modescanlator/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mangathemesia/modescanlator/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/modescanlator/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 3ae3810454..0000000000
Binary files a/multisrc/overrides/mangathemesia/modescanlator/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mangathemesia/modescanlator/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/modescanlator/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index cd12ab3527..0000000000
Binary files a/multisrc/overrides/mangathemesia/modescanlator/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mangathemesia/modescanlator/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/modescanlator/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index e771402fe1..0000000000
Binary files a/multisrc/overrides/mangathemesia/modescanlator/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mangathemesia/modescanlator/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/modescanlator/res/web_hi_res_512.png
deleted file mode 100644
index cb158b95d8..0000000000
Binary files a/multisrc/overrides/mangathemesia/modescanlator/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/mangathemesia/modescanlator/src/ModeScanlator.kt b/multisrc/overrides/mangathemesia/modescanlator/src/ModeScanlator.kt
deleted file mode 100644
index fc73005593..0000000000
--- a/multisrc/overrides/mangathemesia/modescanlator/src/ModeScanlator.kt
+++ /dev/null
@@ -1,26 +0,0 @@
-package eu.kanade.tachiyomi.extension.pt.modescanlator
-
-import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
-import eu.kanade.tachiyomi.network.interceptor.rateLimit
-import okhttp3.OkHttpClient
-import java.text.SimpleDateFormat
-import java.util.Locale
-import java.util.concurrent.TimeUnit
-
-class ModeScanlator : MangaThemesia(
- "Mode Scanlator",
- "https://modescanlator.com",
- "pt-BR",
- mangaUrlDirectory = "/projetos",
- dateFormat = SimpleDateFormat("MMMMM dd, yyyy", Locale("pt", "BR")),
-) {
-
- // Site changed from Madara to WpMangaReader.
- override val versionId: Int = 2
-
- override val client: OkHttpClient = network.cloudflareClient.newBuilder()
- .rateLimit(1, 2, TimeUnit.SECONDS)
- .build()
-
- override val altNamePrefix = "Nome alternativo: "
-}
diff --git a/multisrc/overrides/mangathemesia/mundomangakun/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/mundomangakun/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index a1c5c14ff1..0000000000
Binary files a/multisrc/overrides/mangathemesia/mundomangakun/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mangathemesia/mundomangakun/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/mundomangakun/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index c5b5fc64aa..0000000000
Binary files a/multisrc/overrides/mangathemesia/mundomangakun/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mangathemesia/mundomangakun/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/mundomangakun/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 7ed506564d..0000000000
Binary files a/multisrc/overrides/mangathemesia/mundomangakun/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mangathemesia/mundomangakun/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/mundomangakun/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index fcd39eaa9d..0000000000
Binary files a/multisrc/overrides/mangathemesia/mundomangakun/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mangathemesia/mundomangakun/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/mundomangakun/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 1746bbbabc..0000000000
Binary files a/multisrc/overrides/mangathemesia/mundomangakun/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mangathemesia/mundomangakun/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/mundomangakun/res/web_hi_res_512.png
deleted file mode 100644
index 5b9d6b398f..0000000000
Binary files a/multisrc/overrides/mangathemesia/mundomangakun/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/mangathemesia/mundomangakun/src/MundoMangaKun.kt b/multisrc/overrides/mangathemesia/mundomangakun/src/MundoMangaKun.kt
deleted file mode 100644
index 34f8033561..0000000000
--- a/multisrc/overrides/mangathemesia/mundomangakun/src/MundoMangaKun.kt
+++ /dev/null
@@ -1,21 +0,0 @@
-package eu.kanade.tachiyomi.extension.pt.mundomangakun
-
-import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
-import okhttp3.OkHttpClient
-import java.text.SimpleDateFormat
-import java.util.Locale
-
-class MundoMangaKun : MangaThemesia(
- "Mundo Mangá-Kun",
- "https://mundomangakun.com.br",
- "pt-BR",
- dateFormat = SimpleDateFormat("MMMMM dd, yyyy", Locale("pt", "BR")),
-) {
-
- // Changed their theme from a custom one to MangaThemesia.
- // The URLs are incompatible between the versions.
- override val versionId = 2
-
- override val client: OkHttpClient = super.client.newBuilder()
- .build()
-}
diff --git a/multisrc/overrides/mangathemesia/nekomik/src/Nekomik.kt b/multisrc/overrides/mangathemesia/nekomik/src/Nekomik.kt
index 513409e49c..7603a10fff 100644
--- a/multisrc/overrides/mangathemesia/nekomik/src/Nekomik.kt
+++ b/multisrc/overrides/mangathemesia/nekomik/src/Nekomik.kt
@@ -1,17 +1,49 @@
package eu.kanade.tachiyomi.extension.id.nekomik
+import app.cash.quickjs.QuickJs
import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
import eu.kanade.tachiyomi.network.interceptor.rateLimit
+import eu.kanade.tachiyomi.source.model.Page
+import kotlinx.serialization.Serializable
+import kotlinx.serialization.decodeFromString
import okhttp3.OkHttpClient
-import java.util.concurrent.TimeUnit
+import org.jsoup.nodes.Document
-class Nekomik : MangaThemesia("Nekomik", "https://nekomik.com", "id") {
+class Nekomik : MangaThemesia("Nekomik", "https://nekomik.me", "id") {
- override val client: OkHttpClient = network.cloudflareClient.newBuilder()
- .connectTimeout(10, TimeUnit.SECONDS)
- .readTimeout(30, TimeUnit.SECONDS)
+ override val client: OkHttpClient = super.client.newBuilder()
.rateLimit(4)
.build()
override val hasProjectPage = true
+
+ override fun pageListParse(document: Document): List {
+ val obfuscatedJs = document.selectFirst("script:containsData(fromCharCode)")?.data()
+ ?: return super.pageListParse(document)
+
+ val data = QuickJs.create().use { context ->
+ context.evaluate(
+ """
+ ts_reader = { run: function(...args) { whatever = args[0] } };
+ $obfuscatedJs;
+ JSON.stringify(whatever);
+ """.trimIndent(),
+ ) as String
+ }
+
+ val tsReader = json.decodeFromString(data)
+ val imageUrls = tsReader.sources.firstOrNull()?.images ?: return emptyList()
+ return imageUrls.mapIndexed { index, imageUrl -> Page(index, document.location(), imageUrl) }
+ }
+
+ @Serializable
+ data class TSReader(
+ val sources: List,
+ )
+
+ @Serializable
+ data class ReaderImageSource(
+ val source: String,
+ val images: List,
+ )
}
diff --git a/multisrc/overrides/mangathemesia/nightscans/src/NightScans.kt b/multisrc/overrides/mangathemesia/nightscans/src/NightScans.kt
index 025c679e9c..a5715576c6 100644
--- a/multisrc/overrides/mangathemesia/nightscans/src/NightScans.kt
+++ b/multisrc/overrides/mangathemesia/nightscans/src/NightScans.kt
@@ -1,9 +1,13 @@
package eu.kanade.tachiyomi.extension.en.nightscans
import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
-import okhttp3.Headers
+import eu.kanade.tachiyomi.network.interceptor.rateLimit
+import okhttp3.OkHttpClient
+import java.util.concurrent.TimeUnit
-class NightScans : MangaThemesia("NIGHT SCANS", "https://nightscans.org", "en", "/series") {
- override fun headersBuilder(): Headers.Builder = super.headersBuilder()
- .add("Referer", baseUrl)
+class NightScans : MangaThemesia("NIGHT SCANS", "https://nightscans.net", "en", "/series") {
+
+ override val client: OkHttpClient = super.client.newBuilder()
+ .rateLimit(20, 4, TimeUnit.SECONDS)
+ .build()
}
diff --git a/multisrc/overrides/mangathemesia/nonbiri/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/nonbiri/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..5df1a56f23
Binary files /dev/null and b/multisrc/overrides/mangathemesia/nonbiri/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/nonbiri/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/nonbiri/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..269632709b
Binary files /dev/null and b/multisrc/overrides/mangathemesia/nonbiri/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/nonbiri/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/nonbiri/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..f3cf4e6547
Binary files /dev/null and b/multisrc/overrides/mangathemesia/nonbiri/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/nonbiri/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/nonbiri/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..c5d5fdacef
Binary files /dev/null and b/multisrc/overrides/mangathemesia/nonbiri/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/nonbiri/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/nonbiri/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..891e887d99
Binary files /dev/null and b/multisrc/overrides/mangathemesia/nonbiri/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/nonbiri/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/nonbiri/res/web_hi_res_512.png
new file mode 100644
index 0000000000..c2cf95009c
Binary files /dev/null and b/multisrc/overrides/mangathemesia/nonbiri/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/mangathemesia/nonbiri/src/Nonbiri.kt b/multisrc/overrides/mangathemesia/nonbiri/src/Nonbiri.kt
new file mode 100644
index 0000000000..a0834935b1
--- /dev/null
+++ b/multisrc/overrides/mangathemesia/nonbiri/src/Nonbiri.kt
@@ -0,0 +1,15 @@
+package eu.kanade.tachiyomi.extension.id.nonbiri
+
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+import java.text.SimpleDateFormat
+import java.util.Locale
+
+class Nonbiri : MangaThemesia(
+ "Nonbiri",
+ "https://nonbiri.space",
+ "id",
+ dateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale("id")),
+) {
+
+ override val hasProjectPage = true
+}
diff --git a/multisrc/overrides/zeistmanga/noromax/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/noromax/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/zeistmanga/noromax/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/noromax/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/zeistmanga/noromax/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/noromax/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/zeistmanga/noromax/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/noromax/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/zeistmanga/noromax/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/noromax/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/zeistmanga/noromax/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/noromax/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/zeistmanga/noromax/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/noromax/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/zeistmanga/noromax/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/noromax/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/zeistmanga/noromax/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/noromax/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/zeistmanga/noromax/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/noromax/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/zeistmanga/noromax/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/noromax/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/zeistmanga/noromax/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/noromax/res/web_hi_res_512.png
diff --git a/multisrc/overrides/mangathemesia/noromax/src/Noromax.kt b/multisrc/overrides/mangathemesia/noromax/src/Noromax.kt
new file mode 100644
index 0000000000..144bf7e0a6
--- /dev/null
+++ b/multisrc/overrides/mangathemesia/noromax/src/Noromax.kt
@@ -0,0 +1,11 @@
+package eu.kanade.tachiyomi.extension.id.noromax
+
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+
+class Noromax : MangaThemesia("Noromax", "https://noromax.my.id", "id", "/Komik") {
+
+ // Site changed from ZeistManga to MangaThemesia
+ override val versionId = 2
+
+ override val hasProjectPage = true
+}
diff --git a/multisrc/overrides/mangathemesia/opscans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/opscans/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..5956934249
Binary files /dev/null and b/multisrc/overrides/mangathemesia/opscans/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/opscans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/opscans/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..4a68cdd7ca
Binary files /dev/null and b/multisrc/overrides/mangathemesia/opscans/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/opscans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/opscans/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..4b60784a3b
Binary files /dev/null and b/multisrc/overrides/mangathemesia/opscans/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/opscans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/opscans/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..1c2902361d
Binary files /dev/null and b/multisrc/overrides/mangathemesia/opscans/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/opscans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/opscans/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..229940bde0
Binary files /dev/null and b/multisrc/overrides/mangathemesia/opscans/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/opscans/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/opscans/res/web_hi_res_512.png
new file mode 100644
index 0000000000..c4e354264a
Binary files /dev/null and b/multisrc/overrides/mangathemesia/opscans/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/mangathemesia/origamiorpheans/src/OrigamiOrpheans.kt b/multisrc/overrides/mangathemesia/origamiorpheans/src/OrigamiOrpheans.kt
index f778cc0b47..b0b9d79777 100644
--- a/multisrc/overrides/mangathemesia/origamiorpheans/src/OrigamiOrpheans.kt
+++ b/multisrc/overrides/mangathemesia/origamiorpheans/src/OrigamiOrpheans.kt
@@ -15,7 +15,7 @@ class OrigamiOrpheans : MangaThemesia(
// Scanlator migrated from Madara to WpMangaReader.
override val versionId = 2
- override val client: OkHttpClient = network.cloudflareClient.newBuilder()
+ override val client: OkHttpClient = super.client.newBuilder()
.build()
override val altNamePrefix = "Nomes alternativos: "
diff --git a/multisrc/overrides/mangathemesia/otsugami/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/otsugami/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..0e37f00620
Binary files /dev/null and b/multisrc/overrides/mangathemesia/otsugami/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/otsugami/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/otsugami/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..b2e2990387
Binary files /dev/null and b/multisrc/overrides/mangathemesia/otsugami/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/otsugami/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/otsugami/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..39777045a2
Binary files /dev/null and b/multisrc/overrides/mangathemesia/otsugami/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/otsugami/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/otsugami/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..036ac99298
Binary files /dev/null and b/multisrc/overrides/mangathemesia/otsugami/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/otsugami/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/otsugami/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..45369b4cc3
Binary files /dev/null and b/multisrc/overrides/mangathemesia/otsugami/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/otsugami/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/otsugami/res/web_hi_res_512.png
new file mode 100644
index 0000000000..0456dd1ddf
Binary files /dev/null and b/multisrc/overrides/mangathemesia/otsugami/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/mangathemesia/otsugami/src/Otsugami.kt b/multisrc/overrides/mangathemesia/otsugami/src/Otsugami.kt
new file mode 100644
index 0000000000..260a99a0b4
--- /dev/null
+++ b/multisrc/overrides/mangathemesia/otsugami/src/Otsugami.kt
@@ -0,0 +1,14 @@
+package eu.kanade.tachiyomi.extension.id.otsugami
+
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+import eu.kanade.tachiyomi.network.interceptor.rateLimit
+import okhttp3.OkHttpClient
+
+class Otsugami : MangaThemesia("Otsugami", "https://otsugami.id", "id") {
+
+ override val client: OkHttpClient = super.client.newBuilder()
+ .rateLimit(3)
+ .build()
+
+ override val hasProjectPage = true
+}
diff --git a/multisrc/overrides/mangathemesia/ozulscans/src/OzulScans.kt b/multisrc/overrides/mangathemesia/ozulscans/src/OzulScans.kt
index 126a4adf0e..e1f9fc60bc 100644
--- a/multisrc/overrides/mangathemesia/ozulscans/src/OzulScans.kt
+++ b/multisrc/overrides/mangathemesia/ozulscans/src/OzulScans.kt
@@ -6,7 +6,7 @@ import java.util.Locale
class OzulScans : MangaThemesia(
"Ozul Scans",
- "https://ozulscans.com",
+ "https://kingofmanga.com",
"ar",
dateFormat = SimpleDateFormat("MMM d, yyy", Locale("ar")),
)
diff --git a/multisrc/overrides/mangathemesia/patatescans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/patatescans/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index 06a09308c8..0000000000
Binary files a/multisrc/overrides/mangathemesia/patatescans/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mangathemesia/patatescans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/patatescans/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index 3f242c2736..0000000000
Binary files a/multisrc/overrides/mangathemesia/patatescans/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mangathemesia/patatescans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/patatescans/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 3a8b33e8aa..0000000000
Binary files a/multisrc/overrides/mangathemesia/patatescans/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mangathemesia/patatescans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/patatescans/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 50325d4b40..0000000000
Binary files a/multisrc/overrides/mangathemesia/patatescans/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mangathemesia/patatescans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/patatescans/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 9564f6f2d3..0000000000
Binary files a/multisrc/overrides/mangathemesia/patatescans/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mangathemesia/patatescans/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/patatescans/res/web_hi_res_512.png
deleted file mode 100644
index 370bff2517..0000000000
Binary files a/multisrc/overrides/mangathemesia/patatescans/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/mangathemesia/patatescans/src/Patatescans.kt b/multisrc/overrides/mangathemesia/patatescans/src/Patatescans.kt
deleted file mode 100644
index 8f96ffc4ca..0000000000
--- a/multisrc/overrides/mangathemesia/patatescans/src/Patatescans.kt
+++ /dev/null
@@ -1,5 +0,0 @@
-package eu.kanade.tachiyomi.extension.fr.patatescans
-
-import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
-
-class Patatescans : MangaThemesia("Patatescans", "https://patatescans.com", "fr")
diff --git a/multisrc/overrides/mangathemesia/potatomanga/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/potatomanga/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..22b5f44c46
Binary files /dev/null and b/multisrc/overrides/mangathemesia/potatomanga/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/potatomanga/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/potatomanga/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..d196e814c5
Binary files /dev/null and b/multisrc/overrides/mangathemesia/potatomanga/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/potatomanga/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/potatomanga/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..468199344e
Binary files /dev/null and b/multisrc/overrides/mangathemesia/potatomanga/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/potatomanga/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/potatomanga/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..9a780ff02f
Binary files /dev/null and b/multisrc/overrides/mangathemesia/potatomanga/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/potatomanga/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/potatomanga/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..86716aa030
Binary files /dev/null and b/multisrc/overrides/mangathemesia/potatomanga/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/potatomanga/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/potatomanga/res/web_hi_res_512.png
new file mode 100644
index 0000000000..5c438036eb
Binary files /dev/null and b/multisrc/overrides/mangathemesia/potatomanga/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/mangathemesia/potatomanga/src/PotatoManga.kt b/multisrc/overrides/mangathemesia/potatomanga/src/PotatoManga.kt
new file mode 100644
index 0000000000..44eea894cf
--- /dev/null
+++ b/multisrc/overrides/mangathemesia/potatomanga/src/PotatoManga.kt
@@ -0,0 +1,23 @@
+package eu.kanade.tachiyomi.extension.ar.potatomanga
+
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+import java.text.SimpleDateFormat
+import java.util.Locale
+
+class PotatoManga : MangaThemesia(
+ "PotatoManga",
+ "https://potatomanga.xyz",
+ "ar",
+ dateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale("ar")),
+) {
+ override val seriesArtistSelector =
+ ".infotable tr:contains(الرسام) td:last-child, ${super.seriesArtistSelector}"
+ override val seriesAuthorSelector =
+ ".infotable tr:contains(المؤلف) td:last-child, ${super.seriesAuthorSelector}"
+ override val seriesStatusSelector =
+ ".infotable tr:contains(الحالة) td:last-child, ${super.seriesStatusSelector}"
+ override val seriesTypeSelector =
+ ".infotable tr:contains(النوع) td:last-child, ${super.seriesTypeSelector}"
+ override val seriesAltNameSelector =
+ ".infotable tr:contains(الأسماء الثانوية) td:last-child, ${super.seriesAltNameSelector}"
+}
diff --git a/multisrc/overrides/mangathemesia/quantumscans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/quantumscans/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..5b49b5d64f
Binary files /dev/null and b/multisrc/overrides/mangathemesia/quantumscans/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/quantumscans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/quantumscans/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..c395fe1825
Binary files /dev/null and b/multisrc/overrides/mangathemesia/quantumscans/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/quantumscans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/quantumscans/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..59ac35c3f2
Binary files /dev/null and b/multisrc/overrides/mangathemesia/quantumscans/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/quantumscans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/quantumscans/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..cd4556e7f6
Binary files /dev/null and b/multisrc/overrides/mangathemesia/quantumscans/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/quantumscans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/quantumscans/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..c05a1490a7
Binary files /dev/null and b/multisrc/overrides/mangathemesia/quantumscans/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/quantumscans/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/quantumscans/res/web_hi_res_512.png
new file mode 100644
index 0000000000..e394e11aa9
Binary files /dev/null and b/multisrc/overrides/mangathemesia/quantumscans/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/mangathemesia/quantumscans/src/QuantumScans.kt b/multisrc/overrides/mangathemesia/quantumscans/src/QuantumScans.kt
new file mode 100644
index 0000000000..e5e8a29df3
--- /dev/null
+++ b/multisrc/overrides/mangathemesia/quantumscans/src/QuantumScans.kt
@@ -0,0 +1,13 @@
+package eu.kanade.tachiyomi.extension.en.quantumscans
+
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+import eu.kanade.tachiyomi.network.interceptor.rateLimit
+import okhttp3.OkHttpClient
+import java.util.concurrent.TimeUnit
+
+class QuantumScans : MangaThemesia("Quantum Scans", "https://readers-point.space", "en", "/series") {
+
+ override val client: OkHttpClient = super.client.newBuilder()
+ .rateLimit(12, 3, TimeUnit.SECONDS)
+ .build()
+}
diff --git a/multisrc/overrides/mangathemesia/queenscans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/queenscans/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..847a3610d1
Binary files /dev/null and b/multisrc/overrides/mangathemesia/queenscans/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/queenscans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/queenscans/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..3c4da6d4a6
Binary files /dev/null and b/multisrc/overrides/mangathemesia/queenscans/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/queenscans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/queenscans/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..9f080d5d85
Binary files /dev/null and b/multisrc/overrides/mangathemesia/queenscans/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/queenscans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/queenscans/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..aab37056de
Binary files /dev/null and b/multisrc/overrides/mangathemesia/queenscans/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/queenscans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/queenscans/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..ec2c697900
Binary files /dev/null and b/multisrc/overrides/mangathemesia/queenscans/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/queenscans/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/queenscans/res/web_hi_res_512.png
new file mode 100644
index 0000000000..a85e063b40
Binary files /dev/null and b/multisrc/overrides/mangathemesia/queenscans/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/mangathemesia/queenscans/src/QueenScans.kt b/multisrc/overrides/mangathemesia/queenscans/src/QueenScans.kt
new file mode 100644
index 0000000000..f7144572c0
--- /dev/null
+++ b/multisrc/overrides/mangathemesia/queenscans/src/QueenScans.kt
@@ -0,0 +1,28 @@
+package eu.kanade.tachiyomi.extension.en.queenscans
+
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+import eu.kanade.tachiyomi.network.interceptor.rateLimit
+import eu.kanade.tachiyomi.source.model.SManga
+import okhttp3.Request
+
+class QueenScans : MangaThemesia("Fairy Manga", "https://fairymanga.com", "en") {
+ override val client = super.client.newBuilder()
+ .rateLimit(2)
+ .build()
+
+ override val id = 4680104728999154642
+
+ override fun mangaDetailsRequest(manga: SManga): Request {
+ if (manga.url.startsWith("/comics")) {
+ manga.url.replaceFirst("/comics", mangaUrlDirectory)
+ }
+ return super.mangaDetailsRequest(manga)
+ }
+
+ override fun chapterListRequest(manga: SManga): Request {
+ if (manga.url.startsWith("/comics")) {
+ manga.url.replaceFirst("/comics", mangaUrlDirectory)
+ }
+ return super.chapterListRequest(manga)
+ }
+}
diff --git a/multisrc/overrides/mangathemesia/raiscans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/raiscans/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..b27af8c69e
Binary files /dev/null and b/multisrc/overrides/mangathemesia/raiscans/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/raiscans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/raiscans/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..9e731fef8b
Binary files /dev/null and b/multisrc/overrides/mangathemesia/raiscans/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/raiscans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/raiscans/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..e27743a830
Binary files /dev/null and b/multisrc/overrides/mangathemesia/raiscans/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/raiscans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/raiscans/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..7a2725075a
Binary files /dev/null and b/multisrc/overrides/mangathemesia/raiscans/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/raiscans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/raiscans/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..8ebd972589
Binary files /dev/null and b/multisrc/overrides/mangathemesia/raiscans/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/raiscans/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/raiscans/res/web_hi_res_512.png
new file mode 100644
index 0000000000..ca179b6ad2
Binary files /dev/null and b/multisrc/overrides/mangathemesia/raiscans/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/mangathemesia/raiscans/src/Raiscans.kt b/multisrc/overrides/mangathemesia/raiscans/src/Raiscans.kt
new file mode 100644
index 0000000000..90311c1c28
--- /dev/null
+++ b/multisrc/overrides/mangathemesia/raiscans/src/Raiscans.kt
@@ -0,0 +1,13 @@
+package eu.kanade.tachiyomi.extension.en.raiscans
+
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+import eu.kanade.tachiyomi.network.interceptor.rateLimit
+import okhttp3.OkHttpClient
+import java.util.concurrent.TimeUnit
+
+class Raiscans : MangaThemesia("Raiscans", "https://www.raiscans.com", "en", "/Series") {
+
+ override val client: OkHttpClient = super.client.newBuilder()
+ .rateLimit(20, 5, TimeUnit.SECONDS)
+ .build()
+}
diff --git a/multisrc/overrides/mangathemesia/rawkuma/src/Rawkuma.kt b/multisrc/overrides/mangathemesia/rawkuma/src/Rawkuma.kt
index bce788723e..3bc87fcbea 100644
--- a/multisrc/overrides/mangathemesia/rawkuma/src/Rawkuma.kt
+++ b/multisrc/overrides/mangathemesia/rawkuma/src/Rawkuma.kt
@@ -3,13 +3,10 @@ package eu.kanade.tachiyomi.extension.ja.rawkuma
import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
import eu.kanade.tachiyomi.network.interceptor.rateLimit
import okhttp3.OkHttpClient
-import java.util.concurrent.TimeUnit
class Rawkuma : MangaThemesia("Rawkuma", "https://rawkuma.com/", "ja") {
- override val client: OkHttpClient = network.cloudflareClient.newBuilder()
- .connectTimeout(10, TimeUnit.SECONDS)
- .readTimeout(30, TimeUnit.SECONDS)
+ override val client: OkHttpClient = super.client.newBuilder()
.rateLimit(4)
.build()
}
diff --git a/multisrc/overrides/mangathemesia/readkomik/src/ReadKomik.kt b/multisrc/overrides/mangathemesia/readkomik/src/ReadKomik.kt
index 98a881a7f1..d1b8c75319 100644
--- a/multisrc/overrides/mangathemesia/readkomik/src/ReadKomik.kt
+++ b/multisrc/overrides/mangathemesia/readkomik/src/ReadKomik.kt
@@ -3,13 +3,10 @@ package eu.kanade.tachiyomi.extension.en.readkomik
import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
import eu.kanade.tachiyomi.network.interceptor.rateLimit
import okhttp3.OkHttpClient
-import java.util.concurrent.TimeUnit
class ReadKomik : MangaThemesia("Readkomik", "https://readkomik.com", "en") {
- override val client: OkHttpClient = network.cloudflareClient.newBuilder()
- .connectTimeout(10, TimeUnit.SECONDS)
- .readTimeout(30, TimeUnit.SECONDS)
+ override val client: OkHttpClient = super.client.newBuilder()
.rateLimit(4)
.build()
diff --git a/multisrc/overrides/mangathemesia/ryukonesia/src/Ryukonesia.kt b/multisrc/overrides/mangathemesia/ryukonesia/src/Ryukonesia.kt
index 4e19d66e58..f6a1540aae 100644
--- a/multisrc/overrides/mangathemesia/ryukonesia/src/Ryukonesia.kt
+++ b/multisrc/overrides/mangathemesia/ryukonesia/src/Ryukonesia.kt
@@ -3,13 +3,10 @@ package eu.kanade.tachiyomi.extension.id.ryukonesia
import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
import eu.kanade.tachiyomi.network.interceptor.rateLimit
import okhttp3.OkHttpClient
-import java.util.concurrent.TimeUnit
class Ryukonesia : MangaThemesia("Ryukonesia", "https://ryukonesia.net", "id") {
- override val client: OkHttpClient = network.cloudflareClient.newBuilder()
- .connectTimeout(10, TimeUnit.SECONDS)
- .readTimeout(30, TimeUnit.SECONDS)
+ override val client: OkHttpClient = super.client.newBuilder()
.rateLimit(4)
.build()
}
diff --git a/multisrc/overrides/mangathemesia/sekaikomik/src/Sekaikomik.kt b/multisrc/overrides/mangathemesia/sekaikomik/src/Sekaikomik.kt
index e440f2f934..5b584d1b51 100644
--- a/multisrc/overrides/mangathemesia/sekaikomik/src/Sekaikomik.kt
+++ b/multisrc/overrides/mangathemesia/sekaikomik/src/Sekaikomik.kt
@@ -1,7 +1,26 @@
package eu.kanade.tachiyomi.extension.id.sekaikomik
import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+import eu.kanade.tachiyomi.source.model.SManga
+import org.jsoup.nodes.Document
import java.text.SimpleDateFormat
import java.util.Locale
-class Sekaikomik : MangaThemesia("Sekaikomik", "https://www.sekaikomik.pro", "id", dateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale("id")))
+class Sekaikomik : MangaThemesia(
+ "Sekaikomik",
+ "https://sekaikomik.bio",
+ "id",
+ dateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale("id")),
+) {
+
+ private val junkDescriptionPattern = """ Link Download : .*""".toRegex()
+
+ override fun mangaDetailsParse(document: Document): SManga {
+ val manga = super.mangaDetailsParse(document)
+
+ // Remove junk from description
+ manga.description = manga.description?.replace(junkDescriptionPattern, "")
+
+ return manga
+ }
+}
diff --git a/multisrc/overrides/mangathemesia/sektedoujin/src/SekteDoujin.kt b/multisrc/overrides/mangathemesia/sektedoujin/src/SekteDoujin.kt
index 92df0e544e..dcac72f8a6 100644
--- a/multisrc/overrides/mangathemesia/sektedoujin/src/SekteDoujin.kt
+++ b/multisrc/overrides/mangathemesia/sektedoujin/src/SekteDoujin.kt
@@ -5,13 +5,10 @@ import eu.kanade.tachiyomi.network.interceptor.rateLimit
import okhttp3.OkHttpClient
import java.text.SimpleDateFormat
import java.util.Locale
-import java.util.concurrent.TimeUnit
class SekteDoujin : MangaThemesia("Sekte Doujin", "https://sektedoujin.lol", "id", dateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale.forLanguageTag("id"))) {
- override val client: OkHttpClient = network.cloudflareClient.newBuilder()
- .connectTimeout(10, TimeUnit.SECONDS)
- .readTimeout(30, TimeUnit.SECONDS)
+ override val client: OkHttpClient = super.client.newBuilder()
.rateLimit(4)
.build()
}
diff --git a/multisrc/overrides/mangathemesia/sheamanga/src/SheaManga.kt b/multisrc/overrides/mangathemesia/sheamanga/src/SheaManga.kt
index fb19b54e82..70b8b4676a 100644
--- a/multisrc/overrides/mangathemesia/sheamanga/src/SheaManga.kt
+++ b/multisrc/overrides/mangathemesia/sheamanga/src/SheaManga.kt
@@ -6,7 +6,6 @@ import okhttp3.Dns
import okhttp3.OkHttpClient
import java.text.SimpleDateFormat
import java.util.Locale
-import java.util.concurrent.TimeUnit
class SheaManga : MangaThemesia(
"Shea Manga",
@@ -15,9 +14,7 @@ class SheaManga : MangaThemesia(
dateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale.forLanguageTag("id")),
) {
- override val client: OkHttpClient = network.cloudflareClient.newBuilder()
- .connectTimeout(10, TimeUnit.SECONDS)
- .readTimeout(30, TimeUnit.SECONDS)
+ override val client: OkHttpClient = super.client.newBuilder()
.rateLimit(4)
.dns(Dns.SYSTEM)
.build()
diff --git a/multisrc/overrides/mangathemesia/silencescan/src/SilenceScan.kt b/multisrc/overrides/mangathemesia/silencescan/src/SilenceScan.kt
index c11b6d211d..61bd13ccb7 100644
--- a/multisrc/overrides/mangathemesia/silencescan/src/SilenceScan.kt
+++ b/multisrc/overrides/mangathemesia/silencescan/src/SilenceScan.kt
@@ -16,9 +16,8 @@ class SilenceScan : MangaThemesia(
override val versionId: Int = 2
- override val client: OkHttpClient = network.cloudflareClient.newBuilder()
- .connectTimeout(10, TimeUnit.SECONDS)
- .readTimeout(30, TimeUnit.SECONDS)
+ override val client: OkHttpClient = super.client.newBuilder()
+ .rateLimit(1, 2, TimeUnit.SECONDS)
.build()
override val altNamePrefix = "Nome alternativo: "
diff --git a/multisrc/overrides/mangathemesia/skymangas/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/skymangas/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..b19685d7ac
Binary files /dev/null and b/multisrc/overrides/mangathemesia/skymangas/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/skymangas/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/skymangas/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..15f2b75bb0
Binary files /dev/null and b/multisrc/overrides/mangathemesia/skymangas/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/skymangas/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/skymangas/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..00fdf99430
Binary files /dev/null and b/multisrc/overrides/mangathemesia/skymangas/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/skymangas/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/skymangas/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..75b4295bda
Binary files /dev/null and b/multisrc/overrides/mangathemesia/skymangas/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/skymangas/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/skymangas/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..8f3d258119
Binary files /dev/null and b/multisrc/overrides/mangathemesia/skymangas/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/skymangas/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/skymangas/res/web_hi_res_512.png
new file mode 100644
index 0000000000..4fd9557d83
Binary files /dev/null and b/multisrc/overrides/mangathemesia/skymangas/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/mangathemesia/skymangas/src/SkyMangas.kt b/multisrc/overrides/mangathemesia/skymangas/src/SkyMangas.kt
new file mode 100644
index 0000000000..5ef46470d5
--- /dev/null
+++ b/multisrc/overrides/mangathemesia/skymangas/src/SkyMangas.kt
@@ -0,0 +1,43 @@
+package eu.kanade.tachiyomi.extension.es.skymangas
+
+import android.util.Base64
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+import eu.kanade.tachiyomi.source.model.Page
+import kotlinx.serialization.json.jsonArray
+import kotlinx.serialization.json.jsonPrimitive
+import org.jsoup.nodes.Document
+import java.lang.IllegalArgumentException
+import java.text.SimpleDateFormat
+import java.util.Locale
+
+class SkyMangas : MangaThemesia(
+ "SkyMangas",
+ "https://skymangas.com",
+ "es",
+ dateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale("es")),
+) {
+ override fun pageListParse(document: Document): List {
+ val script = document.selectFirst("div.readercontent > div.wrapper > script")
+ ?: return super.pageListParse(document)
+
+ val scriptSrc = script.attr("src")
+
+ if (scriptSrc.startsWith("data:text/javascript;base64,")) {
+ val encodedData = scriptSrc.substringAfter("data:text/javascript;base64,")
+ val decodedData = Base64.decode(encodedData, Base64.DEFAULT).toString(Charsets.UTF_8)
+
+ val imageListJson = JSON_IMAGE_LIST_REGEX.find(decodedData)?.destructured?.toList()?.get(0).orEmpty()
+ val imageList = try {
+ json.parseToJsonElement(imageListJson).jsonArray
+ } catch (_: IllegalArgumentException) {
+ emptyList()
+ }
+
+ return imageList.mapIndexed { i, jsonEl ->
+ Page(i, document.location(), jsonEl.jsonPrimitive.content)
+ }
+ }
+
+ return super.pageListParse(document)
+ }
+}
diff --git a/multisrc/overrides/mangathemesia/soulscans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/soulscans/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..a58edc097b
Binary files /dev/null and b/multisrc/overrides/mangathemesia/soulscans/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/soulscans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/soulscans/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..688a42f617
Binary files /dev/null and b/multisrc/overrides/mangathemesia/soulscans/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/soulscans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/soulscans/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..f52b8fbdca
Binary files /dev/null and b/multisrc/overrides/mangathemesia/soulscans/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/soulscans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/soulscans/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..3f0e50f679
Binary files /dev/null and b/multisrc/overrides/mangathemesia/soulscans/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/soulscans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/soulscans/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..ca52688a05
Binary files /dev/null and b/multisrc/overrides/mangathemesia/soulscans/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/soulscans/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/soulscans/res/web_hi_res_512.png
new file mode 100644
index 0000000000..2eded446a5
Binary files /dev/null and b/multisrc/overrides/mangathemesia/soulscans/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/mangathemesia/soulscans/src/SoulScans.kt b/multisrc/overrides/mangathemesia/soulscans/src/SoulScans.kt
new file mode 100644
index 0000000000..0e30054aac
--- /dev/null
+++ b/multisrc/overrides/mangathemesia/soulscans/src/SoulScans.kt
@@ -0,0 +1,41 @@
+package eu.kanade.tachiyomi.extension.id.soulscans
+
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+import eu.kanade.tachiyomi.source.model.SManga
+import org.jsoup.nodes.Document
+import java.util.Locale
+
+class SoulScans : MangaThemesia("Soul Scans", "https://soulscans.my.id", "id") {
+
+ override val hasProjectPage = true
+
+ override fun mangaDetailsParse(document: Document) = SManga.create().apply {
+ document.selectFirst(seriesDetailsSelector)?.let { seriesDetails ->
+ title = seriesDetails.selectFirst(seriesTitleSelector)?.text().orEmpty()
+ artist = seriesDetails.selectFirst(seriesArtistSelector)?.ownText().removeEmptyPlaceholder()
+ author = seriesDetails.selectFirst(seriesAuthorSelector)?.ownText().removeEmptyPlaceholder()
+ description = seriesDetails.select(seriesDescriptionSelector).joinToString("\n") { it.text() }.trim()
+ // Add alternative name to manga description
+ val altName = seriesDetails.selectFirst(seriesAltNameSelector)?.ownText().takeIf { it.isNullOrBlank().not() }
+ altName?.let {
+ description = "$description\n\n$altNamePrefix$altName".trim()
+ }
+ val genres = seriesDetails.select(seriesGenreSelector).map { it.text() }.toMutableList()
+ // Add series type (manga/manhwa/manhua/other) to genre
+ seriesDetails.selectFirst(seriesTypeSelector)?.ownText().takeIf { it.isNullOrBlank().not() }?.let { genres.add(it) }
+ genre = genres.map { genre ->
+ genre.lowercase(Locale.forLanguageTag(lang)).replaceFirstChar { char ->
+ if (char.isLowerCase()) {
+ char.titlecase(Locale.forLanguageTag(lang))
+ } else {
+ char.toString()
+ }
+ }
+ }
+ .joinToString { it.trim() }
+
+ status = seriesDetails.selectFirst(seriesStatusSelector)?.text().parseStatus()
+ seriesDetails.select(seriesThumbnailSelector).firstOrNull()?.let { thumbnail_url = it.imgAttr() }
+ }
+ }
+}
diff --git a/multisrc/overrides/mangathemesia/ssshentais/src/SssHentais.kt b/multisrc/overrides/mangathemesia/ssshentais/src/SssHentais.kt
new file mode 100644
index 0000000000..24fb3476bc
--- /dev/null
+++ b/multisrc/overrides/mangathemesia/ssshentais/src/SssHentais.kt
@@ -0,0 +1,36 @@
+package eu.kanade.tachiyomi.extension.pt.ssshentais
+
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+import eu.kanade.tachiyomi.network.GET
+import eu.kanade.tachiyomi.network.interceptor.rateLimit
+import eu.kanade.tachiyomi.source.model.Page
+import okhttp3.OkHttpClient
+import okhttp3.Request
+import java.text.SimpleDateFormat
+import java.util.Locale
+import java.util.concurrent.TimeUnit
+
+class SssHentais : MangaThemesia(
+ "SSS Hentais",
+ "https://hentais.sssscanlator.com",
+ "pt-BR",
+ dateFormat = SimpleDateFormat("MMMMM dd, yyyy", Locale("pt", "BR")),
+) {
+
+ override val client: OkHttpClient = super.client.newBuilder()
+ .rateLimit(1, 2, TimeUnit.SECONDS)
+ .build()
+
+ override fun imageRequest(page: Page): Request {
+ val newHeaders = headersBuilder()
+ .set("Referer", page.url)
+ .set("Accept", "image/avif,image/webp,*/*")
+ .set("Accept-Language", "pt-BR,pt;q=0.8,en-US;q=0.5,en;q=0.3")
+ .set("Sec-Fetch-Dest", "image")
+ .set("Sec-Fetch-Mode", "no-cors")
+ .set("Sec-Fetch-Site", "same-origin")
+ .build()
+
+ return GET(page.imageUrl!!, newHeaders)
+ }
+}
diff --git a/multisrc/overrides/mangathemesia/sssscanlator/src/SSSScanlator.kt b/multisrc/overrides/mangathemesia/sssscanlator/src/SSSScanlator.kt
new file mode 100644
index 0000000000..ff42ec4672
--- /dev/null
+++ b/multisrc/overrides/mangathemesia/sssscanlator/src/SSSScanlator.kt
@@ -0,0 +1,36 @@
+package eu.kanade.tachiyomi.extension.pt.sssscanlator
+
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+import eu.kanade.tachiyomi.network.GET
+import eu.kanade.tachiyomi.network.interceptor.rateLimit
+import eu.kanade.tachiyomi.source.model.Page
+import okhttp3.OkHttpClient
+import okhttp3.Request
+import java.text.SimpleDateFormat
+import java.util.Locale
+import java.util.concurrent.TimeUnit
+
+class SSSScanlator : MangaThemesia(
+ "SSSScanlator",
+ "https://sssscanlator.com",
+ "pt-BR",
+ dateFormat = SimpleDateFormat("MMMMM dd, yyyy", Locale("pt", "BR")),
+) {
+
+ override val client: OkHttpClient = super.client.newBuilder()
+ .rateLimit(1, 2, TimeUnit.SECONDS)
+ .build()
+
+ override fun imageRequest(page: Page): Request {
+ val newHeaders = headersBuilder()
+ .set("Referer", page.url)
+ .set("Accept", "image/avif,image/webp,*/*")
+ .set("Accept-Language", "pt-BR,pt;q=0.8,en-US;q=0.5,en;q=0.3")
+ .set("Sec-Fetch-Dest", "image")
+ .set("Sec-Fetch-Mode", "no-cors")
+ .set("Sec-Fetch-Site", "same-origin")
+ .build()
+
+ return GET(page.imageUrl!!, newHeaders)
+ }
+}
diff --git a/multisrc/overrides/mangathemesia/starlightscan/src/StarlightScan.kt b/multisrc/overrides/mangathemesia/starlightscan/src/StarlightScan.kt
new file mode 100644
index 0000000000..99a51e42cd
--- /dev/null
+++ b/multisrc/overrides/mangathemesia/starlightscan/src/StarlightScan.kt
@@ -0,0 +1,103 @@
+package eu.kanade.tachiyomi.extension.pt.starlightscan
+
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+import eu.kanade.tachiyomi.network.GET
+import eu.kanade.tachiyomi.network.interceptor.rateLimit
+import eu.kanade.tachiyomi.source.model.FilterList
+import eu.kanade.tachiyomi.source.model.MangasPage
+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.OkHttpClient
+import okhttp3.Request
+import okhttp3.Response
+import org.jsoup.nodes.Element
+import java.text.SimpleDateFormat
+import java.util.Locale
+import java.util.concurrent.TimeUnit
+
+class StarlightScan : MangaThemesia(
+ "Starlight Scan",
+ "https://starligthscan.com",
+ "pt-BR",
+ mangaUrlDirectory = "/mangas",
+ dateFormat = SimpleDateFormat("dd/MM/yyyy", Locale("pt", "BR")),
+) {
+
+ override val client: OkHttpClient = super.client.newBuilder()
+ .rateLimit(1, 2, TimeUnit.SECONDS)
+ .build()
+
+ override val sendViewCount = false
+
+ override fun latestUpdatesRequest(page: Int): Request = GET(baseUrl, headers)
+
+ override fun latestUpdatesParse(response: Response): MangasPage {
+ val mangaList = response.asJsoup()
+ .select(latestUpdatesSelector())
+ .map(::latestUpdatesFromElement)
+
+ return MangasPage(mangaList, hasNextPage = false)
+ }
+
+ override fun latestUpdatesSelector() = "div.mostRecentMangaCard__listContainer article.mostRecentMangaCard"
+
+ override fun latestUpdatesFromElement(element: Element): SManga = SManga.create().apply {
+ title = element.selectFirst("a.mostRecentMangaCard__title")!!.text()
+ thumbnail_url = element.selectFirst("img.mostRecentMangaCard__cover")!!.imgAttr()
+ setUrlWithoutDomain(element.selectFirst("a")!!.attr("href"))
+ }
+
+ override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
+ val url = baseUrl.toHttpUrl().newBuilder()
+ .addPathSegment(if (query.isEmpty()) mangaUrlDirectory.substring(1) else "buscar")
+ .addQueryParameter("search", query)
+ .addQueryParameter("page-current", page.toString())
+ .build()
+
+ return GET(url, headers)
+ }
+
+ override fun searchMangaSelector() = "div.bulkMangaList article.bulkMangaCard"
+
+ override fun searchMangaFromElement(element: Element): SManga = SManga.create().apply {
+ title = element.selectFirst("a.bulkMangaCard__title")!!.text()
+ thumbnail_url = element.selectFirst("img.bulkMangaCard__cover")!!.imgAttr()
+ setUrlWithoutDomain(element.selectFirst("a")!!.attr("href"))
+ }
+
+ override fun searchMangaNextPageSelector() = "footer.base__horizontalList a:contains(Próxima):not([disabled])"
+
+ override val seriesDetailsSelector = "section.mangaDetails"
+ override val seriesTitleSelector = "h1.mangaDetails__title"
+ override val seriesAuthorSelector = "span.mangaDetails__author"
+ override val seriesDescriptionSelector = "span.mangaDetails__description"
+ override val seriesGenreSelector = "li.mangaTags__item"
+ override val seriesStatusSelector = "span.base__horizontalList[title^=Status]"
+ override val seriesThumbnailSelector = "img.mangaDetails__cover"
+
+ override fun String?.parseStatus(): Int = when (this) {
+ "Publicação Finalizada" -> SManga.COMPLETED
+ else -> SManga.ONGOING
+ }
+
+ override fun chapterListParse(response: Response): List {
+ return response.asJsoup()
+ .select(chapterListSelector())
+ .map(::chapterFromElement)
+ .filter { it.name.isNotEmpty() }
+ }
+
+ override fun chapterListSelector() = "div.mangaDetails__episodesContainer div.mangaDetails__episode"
+
+ override fun chapterFromElement(element: Element): SChapter = SChapter.create().apply {
+ name = element.selectFirst("a.mangaDetails__episodeTitle")!!.text()
+ date_upload = element.selectFirst("span.mangaDetails__episodeReleaseDate")?.text().parseChapterDate()
+ setUrlWithoutDomain(element.selectFirst("a")!!.absUrl("href"))
+ }
+
+ override val pageSelector = "div.scanImagesContainer img.scanImage"
+
+ override fun getFilterList(): FilterList = FilterList()
+}
diff --git a/multisrc/overrides/mangathemesia/summertoon/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/summertoon/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..31f2f9c56d
Binary files /dev/null and b/multisrc/overrides/mangathemesia/summertoon/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/summertoon/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/summertoon/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..15ba32e164
Binary files /dev/null and b/multisrc/overrides/mangathemesia/summertoon/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/summertoon/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/summertoon/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..69a9d3fb77
Binary files /dev/null and b/multisrc/overrides/mangathemesia/summertoon/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/summertoon/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/summertoon/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..85d2a85b37
Binary files /dev/null and b/multisrc/overrides/mangathemesia/summertoon/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/summertoon/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/summertoon/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..83a684bf77
Binary files /dev/null and b/multisrc/overrides/mangathemesia/summertoon/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/summertoon/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/summertoon/res/web_hi_res_512.png
new file mode 100644
index 0000000000..1d22bf5d17
Binary files /dev/null and b/multisrc/overrides/mangathemesia/summertoon/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/mangathemesia/summertoon/src/SummerToon.kt b/multisrc/overrides/mangathemesia/summertoon/src/SummerToon.kt
new file mode 100644
index 0000000000..65a68fed5d
--- /dev/null
+++ b/multisrc/overrides/mangathemesia/summertoon/src/SummerToon.kt
@@ -0,0 +1,20 @@
+package eu.kanade.tachiyomi.extension.tr.summertoon
+
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+import eu.kanade.tachiyomi.network.interceptor.rateLimit
+import java.text.SimpleDateFormat
+import java.util.Locale
+
+class SummerToon : MangaThemesia(
+ "SummerToon",
+ "https://summertoon.com",
+ "tr",
+ dateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale("tr")),
+) {
+ override val client = super.client.newBuilder()
+ .rateLimit(1, 1)
+ .build()
+
+ override val seriesStatusSelector = ".tsinfo .imptdt:contains(Durum) i"
+ override val seriesAuthorSelector = ".fmed b:contains(Yazar)+span"
+}
diff --git a/multisrc/overrides/mangathemesia/sushiscan/src/SushiScan.kt b/multisrc/overrides/mangathemesia/sushiscan/src/SushiScan.kt
index 6a09eed4f1..4de98fd429 100644
--- a/multisrc/overrides/mangathemesia/sushiscan/src/SushiScan.kt
+++ b/multisrc/overrides/mangathemesia/sushiscan/src/SushiScan.kt
@@ -1,15 +1,27 @@
package eu.kanade.tachiyomi.extension.fr.sushiscan
import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+import eu.kanade.tachiyomi.network.interceptor.rateLimit
import eu.kanade.tachiyomi.source.model.Page
import eu.kanade.tachiyomi.source.model.SManga
-import kotlinx.serialization.json.jsonArray
-import kotlinx.serialization.json.jsonPrimitive
+import kotlinx.serialization.Serializable
+import kotlinx.serialization.decodeFromString
+import okhttp3.Headers
+import okhttp3.OkHttpClient
import org.jsoup.nodes.Document
import java.text.SimpleDateFormat
import java.util.Locale
+import java.util.concurrent.TimeUnit
+
+class SushiScan : MangaThemesia("Sushi-Scan", "https://sushiscan.net", "fr", mangaUrlDirectory = "/catalogue", dateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale.FRENCH)) {
+
+ override val client: OkHttpClient = super.client.newBuilder()
+ .rateLimit(2, 1, TimeUnit.SECONDS)
+ .build()
+
+ override fun headersBuilder(): Headers.Builder = super.headersBuilder()
+ .set("Referer", "$baseUrl$mangaUrlDirectory")
-class SushiScan : MangaThemesia("Sushi-Scan", "https://sushiscan.net", "fr", dateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale.FRENCH)) {
override val altNamePrefix = "Nom alternatif : "
override val seriesAuthorSelector = ".imptdt:contains(Auteur) i, .fmed b:contains(Auteur)+span"
override val seriesStatusSelector = ".imptdt:contains(Statut) i"
@@ -25,28 +37,23 @@ class SushiScan : MangaThemesia("Sushi-Scan", "https://sushiscan.net", "fr", dat
status = document.select(seriesStatusSelector).text().parseStatus()
}
- // Overriding to fix http -> https when needed
override fun pageListParse(document: Document): List {
- val htmlPages = document.select(pageSelector)
- .filterNot { it.imgAttr().isEmpty() }
- .mapIndexed { i, img -> Page(i, "", if (img.imgAttr().contains("https")) img.imgAttr() else img.imgAttr().replace("http", "https")) }
-
- countViews(document)
-
- // Some sites also loads pages via javascript
- if (htmlPages.isNotEmpty()) { return htmlPages }
+ val scriptContent = document.selectFirst("script:containsData(ts_reader)")?.data()
+ ?: return super.pageListParse(document)
+ val jsonString = scriptContent.substringAfter("ts_reader.run(").substringBefore(");")
+ val tsReader = json.decodeFromString(jsonString)
+ val imageUrls = tsReader.sources.firstOrNull()?.images ?: return emptyList()
+ return imageUrls.mapIndexed { index, imageUrl -> Page(index, document.location(), imageUrl.replace("http://", "https://")) }
+ }
- val docString = document.toString()
- val imageListJson = JSON_IMAGE_LIST_REGEX.find(docString)?.destructured?.toList()?.get(0).orEmpty()
- val imageList = try {
- json.parseToJsonElement(imageListJson).jsonArray
- } catch (_: IllegalArgumentException) {
- emptyList()
- }
- val scriptPages = imageList.mapIndexed { i, jsonEl ->
- Page(i, "", jsonEl.jsonPrimitive.content)
- }
+ @Serializable
+ data class TSReader(
+ val sources: List,
+ )
- return scriptPages
- }
+ @Serializable
+ data class ReaderImageSource(
+ val source: String,
+ val images: List,
+ )
}
diff --git a/multisrc/overrides/mangathemesia/sushiscanfr/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/sushiscanfr/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..aabef19589
Binary files /dev/null and b/multisrc/overrides/mangathemesia/sushiscanfr/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/sushiscanfr/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/sushiscanfr/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..462e84620f
Binary files /dev/null and b/multisrc/overrides/mangathemesia/sushiscanfr/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/sushiscanfr/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/sushiscanfr/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..42fe15f564
Binary files /dev/null and b/multisrc/overrides/mangathemesia/sushiscanfr/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/sushiscanfr/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/sushiscanfr/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..5ae9300b38
Binary files /dev/null and b/multisrc/overrides/mangathemesia/sushiscanfr/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/sushiscanfr/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/sushiscanfr/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..656df0261a
Binary files /dev/null and b/multisrc/overrides/mangathemesia/sushiscanfr/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/sushiscanfr/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/sushiscanfr/res/web_hi_res_512.png
new file mode 100644
index 0000000000..373e99d426
Binary files /dev/null and b/multisrc/overrides/mangathemesia/sushiscanfr/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/mangathemesia/sushiscanfr/src/SushiScanFR.kt b/multisrc/overrides/mangathemesia/sushiscanfr/src/SushiScanFR.kt
new file mode 100644
index 0000000000..c34efc31d9
--- /dev/null
+++ b/multisrc/overrides/mangathemesia/sushiscanfr/src/SushiScanFR.kt
@@ -0,0 +1,24 @@
+package eu.kanade.tachiyomi.extension.fr.sushiscanfr
+
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+import eu.kanade.tachiyomi.source.model.SManga
+import org.jsoup.nodes.Document
+import java.text.SimpleDateFormat
+import java.util.Locale
+
+class SushiScanFR : MangaThemesia("Sushiscan.fr", "https://sushiscan.fr", "fr", dateFormat = SimpleDateFormat("MMMM d, yyyy", Locale.FRENCH)) {
+ override val altNamePrefix = "Nom alternatif : "
+ override val seriesAuthorSelector = ".imptdt:contains(Auteur) i, .fmed b:contains(Auteur)+span"
+ override val seriesStatusSelector = ".imptdt:contains(Statut) i"
+ override fun String?.parseStatus(): Int = when {
+ this == null -> SManga.UNKNOWN
+ this.contains("En Cours", ignoreCase = true) -> SManga.ONGOING
+ this.contains("Terminé", ignoreCase = true) -> SManga.COMPLETED
+ else -> SManga.UNKNOWN
+ }
+
+ override fun mangaDetailsParse(document: Document): SManga =
+ super.mangaDetailsParse(document).apply {
+ status = document.select(seriesStatusSelector).text().parseStatus()
+ }
+}
diff --git a/multisrc/overrides/madara/tecnoscan/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/tecnoscan/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/madara/tecnoscan/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/tecnoscan/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/madara/tecnoscan/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/tecnoscan/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/madara/tecnoscan/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/tecnoscan/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/madara/tecnoscan/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/tecnoscan/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/madara/tecnoscan/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/tecnoscan/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/madara/tecnoscan/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/tecnoscan/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/madara/tecnoscan/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/tecnoscan/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/madara/tecnoscan/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/tecnoscan/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/madara/tecnoscan/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/tecnoscan/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/madara/tecnoscan/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/tecnoscan/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/madara/tecnoscan/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/tecnoscan/res/web_hi_res_512.png
diff --git a/multisrc/overrides/mangathemesia/tecnoscan/src/TecnoScan.kt b/multisrc/overrides/mangathemesia/tecnoscan/src/TecnoScan.kt
new file mode 100644
index 0000000000..2b3285c8d4
--- /dev/null
+++ b/multisrc/overrides/mangathemesia/tecnoscan/src/TecnoScan.kt
@@ -0,0 +1,17 @@
+package eu.kanade.tachiyomi.extension.es.tecnoscan
+
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+import java.text.SimpleDateFormat
+import java.util.Locale
+
+class TecnoScan : MangaThemesia(
+ "Tecno Scan",
+ "https://tecnoscann.com",
+ "es",
+ dateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale("es")),
+) {
+ // Site moved from Madara to MangaThemesia
+ override val versionId = 3
+
+ override val seriesStatusSelector = ".tsinfo .imptdt:contains(Estado) i"
+}
diff --git a/multisrc/overrides/mangathemesia/tenkaiscan/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/tenkaiscan/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..9f0bcaaf7f
Binary files /dev/null and b/multisrc/overrides/mangathemesia/tenkaiscan/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/tenkaiscan/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/tenkaiscan/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..a1a5c015e2
Binary files /dev/null and b/multisrc/overrides/mangathemesia/tenkaiscan/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/tenkaiscan/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/tenkaiscan/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..9aad01888f
Binary files /dev/null and b/multisrc/overrides/mangathemesia/tenkaiscan/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/tenkaiscan/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/tenkaiscan/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..94d5f1c64e
Binary files /dev/null and b/multisrc/overrides/mangathemesia/tenkaiscan/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/tenkaiscan/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/tenkaiscan/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..0281691862
Binary files /dev/null and b/multisrc/overrides/mangathemesia/tenkaiscan/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/tenkaiscan/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/tenkaiscan/res/web_hi_res_512.png
new file mode 100644
index 0000000000..63da273720
Binary files /dev/null and b/multisrc/overrides/mangathemesia/tenkaiscan/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/mangathemesia/tenkaiscan/src/TenkaiScan.kt b/multisrc/overrides/mangathemesia/tenkaiscan/src/TenkaiScan.kt
new file mode 100644
index 0000000000..8c4703212d
--- /dev/null
+++ b/multisrc/overrides/mangathemesia/tenkaiscan/src/TenkaiScan.kt
@@ -0,0 +1,12 @@
+package eu.kanade.tachiyomi.extension.es.tenkaiscan
+
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+import java.text.SimpleDateFormat
+import java.util.Locale
+
+class TenkaiScan : MangaThemesia(
+ "TenkaiScan",
+ "https://tenkaiscan.net",
+ "es",
+ dateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale("en")),
+)
diff --git a/multisrc/overrides/mangathemesia/tsundokutraducoes/src/TsundokuTraducoes.kt b/multisrc/overrides/mangathemesia/tsundokutraducoes/src/TsundokuTraducoes.kt
index 66e4a8bdaa..3211e6c8aa 100644
--- a/multisrc/overrides/mangathemesia/tsundokutraducoes/src/TsundokuTraducoes.kt
+++ b/multisrc/overrides/mangathemesia/tsundokutraducoes/src/TsundokuTraducoes.kt
@@ -14,7 +14,7 @@ class TsundokuTraducoes : MangaThemesia(
dateFormat = SimpleDateFormat("MMMMM d, yyyy", Locale("pt", "BR")),
) {
- override val client: OkHttpClient = network.cloudflareClient.newBuilder()
+ override val client: OkHttpClient = super.client.newBuilder()
.rateLimit(1, 2, TimeUnit.SECONDS)
.build()
diff --git a/multisrc/overrides/mangathemesia/uzaymanga/src/UzayManga.kt b/multisrc/overrides/mangathemesia/uzaymanga/src/UzayManga.kt
index 6ce8dcf98f..a1c083e7ec 100644
--- a/multisrc/overrides/mangathemesia/uzaymanga/src/UzayManga.kt
+++ b/multisrc/overrides/mangathemesia/uzaymanga/src/UzayManga.kt
@@ -4,4 +4,9 @@ import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
import java.text.SimpleDateFormat
import java.util.Locale
-class UzayManga : MangaThemesia("Uzay Manga", "https://uzaymanga.com", "tr", dateFormat = SimpleDateFormat("MMM d, yyyy", Locale("tr")))
+class UzayManga : MangaThemesia(
+ "Uzay Manga",
+ "https://uzaymanga.com",
+ "tr",
+ dateFormat = SimpleDateFormat("MMM d, yyyy", Locale("tr")),
+)
diff --git a/multisrc/overrides/mangathemesia/vexmanga/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/vexmanga/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..d29e1c721f
Binary files /dev/null and b/multisrc/overrides/mangathemesia/vexmanga/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/vexmanga/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/vexmanga/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..fad5354685
Binary files /dev/null and b/multisrc/overrides/mangathemesia/vexmanga/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/vexmanga/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/vexmanga/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..948a8a97e1
Binary files /dev/null and b/multisrc/overrides/mangathemesia/vexmanga/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/vexmanga/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/vexmanga/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..2c525ee197
Binary files /dev/null and b/multisrc/overrides/mangathemesia/vexmanga/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/vexmanga/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/vexmanga/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..8ceff41dd2
Binary files /dev/null and b/multisrc/overrides/mangathemesia/vexmanga/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/mangathemesia/vexmanga/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/vexmanga/res/web_hi_res_512.png
new file mode 100644
index 0000000000..67ed7b365e
Binary files /dev/null and b/multisrc/overrides/mangathemesia/vexmanga/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/mangathemesia/vexmanga/src/VexManga.kt b/multisrc/overrides/mangathemesia/vexmanga/src/VexManga.kt
new file mode 100644
index 0000000000..ef25a4e02b
--- /dev/null
+++ b/multisrc/overrides/mangathemesia/vexmanga/src/VexManga.kt
@@ -0,0 +1,74 @@
+package eu.kanade.tachiyomi.extension.ar.vexmanga
+
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+import eu.kanade.tachiyomi.source.model.Page
+import eu.kanade.tachiyomi.source.model.SChapter
+import eu.kanade.tachiyomi.source.model.SManga
+import kotlinx.serialization.json.jsonArray
+import kotlinx.serialization.json.jsonPrimitive
+import org.jsoup.nodes.Document
+import org.jsoup.nodes.Element
+import java.lang.IllegalArgumentException
+import java.util.Calendar
+
+class VexManga : MangaThemesia(
+ "فيكس مانجا",
+ "https://vexmanga.com",
+ "ar",
+) {
+ override fun searchMangaSelector() = ".listupd .latest-series, ${super.searchMangaSelector()}"
+ override val sendViewCount = false
+ override fun chapterListSelector() = ".ulChapterList > a, ${super.chapterListSelector()}"
+
+ override val seriesArtistSelector =
+ ".tsinfo .imptdt:contains(الرسام) i, ${super.seriesArtistSelector}"
+ override val seriesAuthorSelector =
+ ".tsinfo .imptdt:contains(المؤلف) i, ${super.seriesAuthorSelector}"
+ override val seriesStatusSelector =
+ ".tsinfo .imptdt:contains(الحالة) i, ${super.seriesStatusSelector}"
+ override val seriesTypeSelector =
+ ".tsinfo .imptdt:contains(النوع) i, ${super.seriesTypeSelector}"
+
+ override fun String?.parseStatus() = when {
+ this == null -> SManga.UNKNOWN
+ this.contains("مستمر", ignoreCase = true) -> SManga.ONGOING
+ this.contains("مكتمل", ignoreCase = true) -> SManga.COMPLETED
+ this.contains("متوقف", ignoreCase = true) -> SManga.ON_HIATUS
+ else -> SManga.UNKNOWN
+ }
+
+ override fun chapterFromElement(element: Element) = SChapter.create().apply {
+ setUrlWithoutDomain(element.attr("href"))
+ name = element.select(".chapternum").text()
+ date_upload = element.select(".chapterdate").text().parseRelativeDate()
+ }
+
+ private fun String.parseRelativeDate(): Long {
+ val number = Regex("""(\d+)""").find(this)?.value?.toIntOrNull() ?: return 0
+ val cal = Calendar.getInstance()
+
+ return when {
+ this.contains("أيام", true) -> cal.apply { add(Calendar.DAY_OF_MONTH, -number) }.timeInMillis
+ this.contains("ساعة", true) -> cal.apply { add(Calendar.HOUR, -number) }.timeInMillis
+ this.contains("دقائق", true) -> cal.apply { add(Calendar.MINUTE, -number) }.timeInMillis
+ this.contains("أسبوعين", true) -> cal.apply { add(Calendar.DAY_OF_MONTH, -number * 7) }.timeInMillis
+ this.contains("أشهر", true) -> cal.apply { add(Calendar.MONTH, -number) }.timeInMillis
+ else -> 0
+ }
+ }
+
+ override fun pageListParse(document: Document): List {
+ val docString = document.toString()
+ val imageListJson = JSON_IMAGE_LIST_REGEX.find(docString)?.destructured?.toList()?.get(0).orEmpty()
+ val imageList = try {
+ json.parseToJsonElement(imageListJson).jsonArray
+ } catch (_: IllegalArgumentException) {
+ emptyList()
+ }
+ val scriptPages = imageList.mapIndexed { i, jsonEl ->
+ Page(i, document.location(), jsonEl.jsonPrimitive.content)
+ }
+
+ return scriptPages
+ }
+}
diff --git a/multisrc/overrides/mangathemesia/walpurgisscan/src/WalpurgisScan.kt b/multisrc/overrides/mangathemesia/walpurgisscan/src/WalpurgisScan.kt
index 6ecfc4ade6..f5ed2e7afb 100644
--- a/multisrc/overrides/mangathemesia/walpurgisscan/src/WalpurgisScan.kt
+++ b/multisrc/overrides/mangathemesia/walpurgisscan/src/WalpurgisScan.kt
@@ -4,6 +4,6 @@ import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
import java.text.SimpleDateFormat
import java.util.Locale
-class WalpurgisScan : MangaThemesia("Walpurgi Scan", "https://www.walpurgiscan.com", "it", dateFormat = SimpleDateFormat("MMM d, yyyy", Locale("it"))) {
+class WalpurgisScan : MangaThemesia("Walpurgi Scan", "https://www.walpurgiscan.it", "it", dateFormat = SimpleDateFormat("MMM d, yyyy", Locale("it"))) {
override val id = 6566957355096372149
}
diff --git a/multisrc/overrides/mangathemesia/westmanga/src/WestManga.kt b/multisrc/overrides/mangathemesia/westmanga/src/WestManga.kt
index 2d460ba156..b8e09bfdb3 100644
--- a/multisrc/overrides/mangathemesia/westmanga/src/WestManga.kt
+++ b/multisrc/overrides/mangathemesia/westmanga/src/WestManga.kt
@@ -3,15 +3,12 @@ package eu.kanade.tachiyomi.extension.id.westmanga
import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
import eu.kanade.tachiyomi.network.interceptor.rateLimit
import okhttp3.OkHttpClient
-import java.util.concurrent.TimeUnit
-class WestManga : MangaThemesia("West Manga", "https://westmanga.info", "id") {
+class WestManga : MangaThemesia("West Manga", "https://westmanga.org", "id") {
// Formerly "West Manga (WP Manga Stream)"
override val id = 8883916630998758688
- override val client: OkHttpClient = network.cloudflareClient.newBuilder()
- .connectTimeout(10, TimeUnit.SECONDS)
- .readTimeout(30, TimeUnit.SECONDS)
+ override val client: OkHttpClient = super.client.newBuilder()
.rateLimit(4)
.build()
diff --git a/multisrc/overrides/mangathemesia/worldromancetranslation/src/WorldRomanceTranslation.kt b/multisrc/overrides/mangathemesia/worldromancetranslation/src/WorldRomanceTranslation.kt
index 47629eda5d..3482be3fc1 100644
--- a/multisrc/overrides/mangathemesia/worldromancetranslation/src/WorldRomanceTranslation.kt
+++ b/multisrc/overrides/mangathemesia/worldromancetranslation/src/WorldRomanceTranslation.kt
@@ -2,7 +2,6 @@ package eu.kanade.tachiyomi.extension.id.worldromancetranslation
import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
import eu.kanade.tachiyomi.source.model.SManga
-import okhttp3.Headers
import org.jsoup.nodes.Document
import java.text.SimpleDateFormat
import java.util.Locale
@@ -17,10 +16,6 @@ class WorldRomanceTranslation : MangaThemesia(
override val hasProjectPage = true
- override fun headersBuilder(): Headers.Builder {
- return super.headersBuilder().add("Referer", baseUrl)
- }
-
override fun mangaDetailsParse(document: Document): SManga {
val thumbnail = document.select(seriesThumbnailSelector)
diff --git a/multisrc/overrides/mangathemesia/xcalibrscans/src/xCaliBRScans.kt b/multisrc/overrides/mangathemesia/xcalibrscans/src/xCaliBRScans.kt
index 00c8ca8118..e764499da9 100644
--- a/multisrc/overrides/mangathemesia/xcalibrscans/src/xCaliBRScans.kt
+++ b/multisrc/overrides/mangathemesia/xcalibrscans/src/xCaliBRScans.kt
@@ -8,13 +8,10 @@ import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient
import org.jsoup.nodes.Document
import org.jsoup.nodes.Element
-import java.util.concurrent.TimeUnit
class xCaliBRScans : MangaThemesia("xCaliBR Scans", "https://xcalibrscans.com", "en") {
- override val client: OkHttpClient = network.cloudflareClient.newBuilder()
- .connectTimeout(10, TimeUnit.SECONDS)
- .readTimeout(30, TimeUnit.SECONDS)
+ override val client: OkHttpClient = super.client.newBuilder()
.addInterceptor(AntiScrapInterceptor())
.rateLimit(2)
.build()
@@ -43,7 +40,7 @@ class xCaliBRScans : MangaThemesia("xCaliBR Scans", "https://xcalibrscans.com",
}
}
- return imgUrls.mapIndexed { index, imageUrl -> Page(index, imageUrl = imageUrl) }
+ return imgUrls.mapIndexed { index, imageUrl -> Page(index, document.location(), imageUrl) }
}
private fun parseAntiScrapScramble(element: Element, destination: MutableList) {
diff --git a/multisrc/overrides/mmrcms/zahard/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/zahard/res/mipmap-hdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/mmrcms/zahard/res/mipmap-hdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/zahard/res/mipmap-hdpi/ic_launcher.png
diff --git a/multisrc/overrides/mmrcms/zahard/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/zahard/res/mipmap-mdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/mmrcms/zahard/res/mipmap-mdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/zahard/res/mipmap-mdpi/ic_launcher.png
diff --git a/multisrc/overrides/mmrcms/zahard/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/zahard/res/mipmap-xhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/mmrcms/zahard/res/mipmap-xhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/zahard/res/mipmap-xhdpi/ic_launcher.png
diff --git a/multisrc/overrides/mmrcms/zahard/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/zahard/res/mipmap-xxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/mmrcms/zahard/res/mipmap-xxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/zahard/res/mipmap-xxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/mmrcms/zahard/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mangathemesia/zahard/res/mipmap-xxxhdpi/ic_launcher.png
similarity index 100%
rename from multisrc/overrides/mmrcms/zahard/res/mipmap-xxxhdpi/ic_launcher.png
rename to multisrc/overrides/mangathemesia/zahard/res/mipmap-xxxhdpi/ic_launcher.png
diff --git a/multisrc/overrides/mmrcms/zahard/res/web_hi_res_512.png b/multisrc/overrides/mangathemesia/zahard/res/web_hi_res_512.png
similarity index 100%
rename from multisrc/overrides/mmrcms/zahard/res/web_hi_res_512.png
rename to multisrc/overrides/mangathemesia/zahard/res/web_hi_res_512.png
diff --git a/multisrc/overrides/mangathemesia/zahard/src/Zahard.kt b/multisrc/overrides/mangathemesia/zahard/src/Zahard.kt
new file mode 100644
index 0000000000..641e9093c7
--- /dev/null
+++ b/multisrc/overrides/mangathemesia/zahard/src/Zahard.kt
@@ -0,0 +1,36 @@
+package eu.kanade.tachiyomi.extension.en.zahard
+
+import eu.kanade.tachiyomi.multisrc.mangathemesia.MangaThemesia
+import eu.kanade.tachiyomi.network.GET
+import eu.kanade.tachiyomi.source.model.FilterList
+import okhttp3.HttpUrl.Companion.toHttpUrl
+import okhttp3.Request
+
+class Zahard : MangaThemesia(
+ "Zahard",
+ "https://zahard.xyz",
+ "en",
+ mangaUrlDirectory = "/library",
+) {
+ override val versionId = 2
+
+ override val supportsLatest = false
+
+ override val pageSelector = "div#chapter_imgs img"
+
+ override fun searchMangaNextPageSelector() = "a[rel=next]"
+
+ override fun chapterListSelector() = "#chapterlist > ul > a"
+
+ override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
+ val url = baseUrl.toHttpUrl().newBuilder()
+ .addPathSegment(mangaUrlDirectory.substring(1))
+ .addQueryParameter("search", query)
+ .addQueryParameter("page", page.toString())
+ .build()
+
+ return GET(url, headers)
+ }
+
+ override fun getFilterList() = FilterList()
+}
diff --git a/multisrc/overrides/mangaworld/default/AndroidManifest.xml b/multisrc/overrides/mangaworld/default/AndroidManifest.xml
index 30deb7f797..8072ee00db 100644
--- a/multisrc/overrides/mangaworld/default/AndroidManifest.xml
+++ b/multisrc/overrides/mangaworld/default/AndroidManifest.xml
@@ -1,2 +1,2 @@
-
+
diff --git a/multisrc/overrides/mccms/haoman6/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mccms/haoman6/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index 2445529494..0000000000
Binary files a/multisrc/overrides/mccms/haoman6/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mccms/haoman6/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mccms/haoman6/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index 177f76bc9e..0000000000
Binary files a/multisrc/overrides/mccms/haoman6/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mccms/haoman6/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mccms/haoman6/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index abf8ee911b..0000000000
Binary files a/multisrc/overrides/mccms/haoman6/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mccms/haoman6/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mccms/haoman6/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 8462b7bdbf..0000000000
Binary files a/multisrc/overrides/mccms/haoman6/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mccms/haoman6/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mccms/haoman6/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 8ba646a3aa..0000000000
Binary files a/multisrc/overrides/mccms/haoman6/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mccms/haoman6/res/web_hi_res_512.png b/multisrc/overrides/mccms/haoman6/res/web_hi_res_512.png
deleted file mode 100644
index 7f1d38eb17..0000000000
Binary files a/multisrc/overrides/mccms/haoman6/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/mccms/haoman6/src/Haoman6.kt b/multisrc/overrides/mccms/haoman6/src/Haoman6.kt
deleted file mode 100644
index 0f67d99ff5..0000000000
--- a/multisrc/overrides/mccms/haoman6/src/Haoman6.kt
+++ /dev/null
@@ -1,18 +0,0 @@
-package eu.kanade.tachiyomi.extension.zh.haoman6
-
-import eu.kanade.tachiyomi.multisrc.mccms.MCCMSWeb
-import eu.kanade.tachiyomi.network.GET
-import eu.kanade.tachiyomi.source.model.SChapter
-import eu.kanade.tachiyomi.source.model.SManga
-
-class Haoman6 : MCCMSWeb("好漫6", "https://www.haoman6.com") {
- override fun SManga.cleanup() = apply {
- description = description?.substringBefore(title)
- title = title.removeSuffix("(最新在线)").removeSuffix("-")
- }
-
- override fun pageListRequest(chapter: SChapter) =
- GET(baseUrl + chapter.url, headers)
-
- override val lazyLoadImageAttr = "mob-ec"
-}
diff --git a/multisrc/overrides/mccms/haoman6glens/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mccms/haoman6glens/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index 19c085465c..0000000000
Binary files a/multisrc/overrides/mccms/haoman6glens/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mccms/haoman6glens/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mccms/haoman6glens/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index 85b1119b87..0000000000
Binary files a/multisrc/overrides/mccms/haoman6glens/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mccms/haoman6glens/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mccms/haoman6glens/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index e8d38996ee..0000000000
Binary files a/multisrc/overrides/mccms/haoman6glens/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mccms/haoman6glens/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mccms/haoman6glens/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 990f59368c..0000000000
Binary files a/multisrc/overrides/mccms/haoman6glens/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mccms/haoman6glens/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mccms/haoman6glens/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 75b64e69f6..0000000000
Binary files a/multisrc/overrides/mccms/haoman6glens/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mccms/haoman6glens/res/web_hi_res_512.png b/multisrc/overrides/mccms/haoman6glens/res/web_hi_res_512.png
deleted file mode 100644
index 2c881f6d80..0000000000
Binary files a/multisrc/overrides/mccms/haoman6glens/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/mccms/haoman6glens/src/Haoman6glens.kt b/multisrc/overrides/mccms/haoman6glens/src/Haoman6glens.kt
deleted file mode 100644
index 7b0ff5e587..0000000000
--- a/multisrc/overrides/mccms/haoman6glens/src/Haoman6glens.kt
+++ /dev/null
@@ -1,12 +0,0 @@
-package eu.kanade.tachiyomi.extension.zh.haoman6glens
-
-import eu.kanade.tachiyomi.multisrc.mccms.MCCMSWeb
-import eu.kanade.tachiyomi.source.model.SManga
-
-class Haoman6glens : MCCMSWeb("好漫6 (g-lens)", "https://www.g-lens.com") {
- override fun SManga.cleanup() = apply {
- title = title.removeSuffix("_").removeSuffix("-").removeSuffix("漫画")
- }
-
- override val lazyLoadImageAttr = "pc-ec"
-}
diff --git a/multisrc/overrides/mmrcms/fallenangelsscans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mmrcms/fallenangelsscans/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index bffcc3df0e..0000000000
Binary files a/multisrc/overrides/mmrcms/fallenangelsscans/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mmrcms/fallenangelsscans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mmrcms/fallenangelsscans/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index f2f352ef2f..0000000000
Binary files a/multisrc/overrides/mmrcms/fallenangelsscans/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mmrcms/fallenangelsscans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mmrcms/fallenangelsscans/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 82d3d4eac1..0000000000
Binary files a/multisrc/overrides/mmrcms/fallenangelsscans/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mmrcms/fallenangelsscans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mmrcms/fallenangelsscans/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 1aae40c6dd..0000000000
Binary files a/multisrc/overrides/mmrcms/fallenangelsscans/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mmrcms/fallenangelsscans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mmrcms/fallenangelsscans/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 375ca9c05f..0000000000
Binary files a/multisrc/overrides/mmrcms/fallenangelsscans/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mmrcms/fallenangelsscans/res/web_hi_res_512.png b/multisrc/overrides/mmrcms/fallenangelsscans/res/web_hi_res_512.png
deleted file mode 100644
index 8d2327466c..0000000000
Binary files a/multisrc/overrides/mmrcms/fallenangelsscans/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/mmrcms/frscan/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mmrcms/frscan/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index 17656f64fd..0000000000
Binary files a/multisrc/overrides/mmrcms/frscan/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mmrcms/frscan/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mmrcms/frscan/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index c463b18fe0..0000000000
Binary files a/multisrc/overrides/mmrcms/frscan/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mmrcms/frscan/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mmrcms/frscan/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 3de26b4c6b..0000000000
Binary files a/multisrc/overrides/mmrcms/frscan/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mmrcms/frscan/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mmrcms/frscan/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 5f682d92d2..0000000000
Binary files a/multisrc/overrides/mmrcms/frscan/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mmrcms/frscan/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mmrcms/frscan/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 45062e7025..0000000000
Binary files a/multisrc/overrides/mmrcms/frscan/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mmrcms/frscan/res/web_hi_res_512.png b/multisrc/overrides/mmrcms/frscan/res/web_hi_res_512.png
deleted file mode 100644
index 48ca32cd1d..0000000000
Binary files a/multisrc/overrides/mmrcms/frscan/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/mmrcms/leomanga/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mmrcms/leomanga/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index ed095c35db..0000000000
Binary files a/multisrc/overrides/mmrcms/leomanga/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mmrcms/leomanga/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mmrcms/leomanga/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index f1405f306b..0000000000
Binary files a/multisrc/overrides/mmrcms/leomanga/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mmrcms/leomanga/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mmrcms/leomanga/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 359b7a9765..0000000000
Binary files a/multisrc/overrides/mmrcms/leomanga/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mmrcms/leomanga/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mmrcms/leomanga/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 7a9d75ece1..0000000000
Binary files a/multisrc/overrides/mmrcms/leomanga/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mmrcms/leomanga/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mmrcms/leomanga/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 717a837631..0000000000
Binary files a/multisrc/overrides/mmrcms/leomanga/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mmrcms/leomanga/res/web_hi_res_512.png b/multisrc/overrides/mmrcms/leomanga/res/web_hi_res_512.png
deleted file mode 100644
index 5140c569e2..0000000000
Binary files a/multisrc/overrides/mmrcms/leomanga/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/mmrcms/mangafr/src/MangaFR.kt b/multisrc/overrides/mmrcms/mangafr/src/MangaFR.kt
new file mode 100644
index 0000000000..83328562d1
--- /dev/null
+++ b/multisrc/overrides/mmrcms/mangafr/src/MangaFR.kt
@@ -0,0 +1,55 @@
+package eu.kanade.tachiyomi.extension.fr.mangafr
+
+import eu.kanade.tachiyomi.multisrc.mmrcms.MMRCMS
+import eu.kanade.tachiyomi.source.model.SChapter
+import eu.kanade.tachiyomi.source.model.SManga
+import okhttp3.Response
+import org.jsoup.nodes.Element
+import java.text.SimpleDateFormat
+import java.util.Locale
+
+class MangaFR : MMRCMS("Manga-FR", "https://manga-fr.cc", "fr") {
+ override fun mangaDetailsParse(response: Response): SManga {
+ return super.mangaDetailsParse(response).apply {
+ title = title.replace("Chapitres ", "")
+ }
+ }
+
+ override fun nullableChapterFromElement(element: Element): SChapter? {
+ val chapter = SChapter.create()
+
+ val titleWrapper = element.select("[class^=chapter-title-rtl]").first()!!
+ val chapterElement = titleWrapper.getElementsByTag("a")!!
+ val url = chapterElement.attr("href")
+
+ chapter.url = getUrlWithoutBaseUrl(url)
+
+ // Construct chapter names
+ // Before -> Scan VF:
+ // Now -> Chapitre : OR Chapitre
+ val chapterText = chapterElement.text()
+ val numberRegex = Regex("""[1-9]\d*(\.\d+)*""")
+ val chapterNumber = numberRegex.find(chapterText)?.value.orEmpty()
+ val chapterTitle = titleWrapper.getElementsByTag("em")!!.text()
+ if (chapterTitle.toIntOrNull() != null) {
+ chapter.name = "Chapitre $chapterNumber"
+ } else {
+ chapter.name = "Chapitre $chapterNumber : $chapterTitle"
+ }
+
+ // Parse date
+ val dateText = element.getElementsByClass("date-chapter-title-rtl").text().trim()
+
+ chapter.date_upload = runCatching {
+ dateFormat.parse(dateText)?.time
+ }.getOrNull() ?: 0L
+
+ return chapter
+ }
+
+ companion object {
+ val dateFormat by lazy {
+ SimpleDateFormat("d MMM. yyyy", Locale.US)
+ }
+ }
+}
diff --git a/multisrc/overrides/mmrcms/mangascan/src/MangaScan.kt b/multisrc/overrides/mmrcms/mangascan/src/MangaScan.kt
new file mode 100644
index 0000000000..41a67e3209
--- /dev/null
+++ b/multisrc/overrides/mmrcms/mangascan/src/MangaScan.kt
@@ -0,0 +1,17 @@
+package eu.kanade.tachiyomi.extension.fr.mangascan
+
+import eu.kanade.tachiyomi.multisrc.mmrcms.MMRCMS
+import eu.kanade.tachiyomi.network.GET
+import eu.kanade.tachiyomi.source.model.Page
+import okhttp3.Request
+
+class MangaScan : MMRCMS("Manga-Scan", "https://manga-scan.me", "fr") {
+ override fun imageRequest(page: Page): Request {
+ val newHeaders = headersBuilder()
+ .set("Referer", baseUrl)
+ .set("Accept", "image/avif,image/webp,*/*")
+ .build()
+
+ return GET(page.imageUrl!!, newHeaders)
+ }
+}
diff --git a/multisrc/overrides/mmrcms/scanone/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mmrcms/scanone/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index 01d62d703e..0000000000
Binary files a/multisrc/overrides/mmrcms/scanone/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mmrcms/scanone/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mmrcms/scanone/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index 938684b6ce..0000000000
Binary files a/multisrc/overrides/mmrcms/scanone/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mmrcms/scanone/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mmrcms/scanone/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index 80ba0f8102..0000000000
Binary files a/multisrc/overrides/mmrcms/scanone/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mmrcms/scanone/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mmrcms/scanone/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 5f6803bdeb..0000000000
Binary files a/multisrc/overrides/mmrcms/scanone/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mmrcms/scanone/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mmrcms/scanone/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index ea931f7edb..0000000000
Binary files a/multisrc/overrides/mmrcms/scanone/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mmrcms/scanone/res/web_hi_res_512.png b/multisrc/overrides/mmrcms/scanone/res/web_hi_res_512.png
deleted file mode 100644
index a0f97bf081..0000000000
Binary files a/multisrc/overrides/mmrcms/scanone/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/monochrome/default/AndroidManifest.xml b/multisrc/overrides/monochrome/default/AndroidManifest.xml
index c1dc6e6eaa..37d1fedbdc 100644
--- a/multisrc/overrides/monochrome/default/AndroidManifest.xml
+++ b/multisrc/overrides/monochrome/default/AndroidManifest.xml
@@ -1,6 +1,5 @@
-
+
-
-
+
diff --git a/multisrc/overrides/multichan/henchan/src/HenChan.kt b/multisrc/overrides/multichan/henchan/src/HenChan.kt
index 2c3fc67960..8c5b6693b0 100644
--- a/multisrc/overrides/multichan/henchan/src/HenChan.kt
+++ b/multisrc/overrides/multichan/henchan/src/HenChan.kt
@@ -28,9 +28,9 @@ import java.text.SimpleDateFormat
import java.util.Date
import java.util.Locale
-class HenChan : MultiChan("HenChan", "http://y.hchan.live", "ru"), ConfigurableSource {
+class HenChan : MultiChan("HenChan", "https://xxxxx.hentaichan.live", "ru"), ConfigurableSource {
- override val id: Long = 5504588601186153612
+ override val id = 5504588601186153612
private val preferences: SharedPreferences by lazy {
Injekt.get().getSharedPreferences("source_$id", 0x0000)
@@ -40,6 +40,8 @@ class HenChan : MultiChan("HenChan", "http://y.hchan.live", "ru"), ConfigurableS
override val baseUrl = domain
+ override fun latestUpdatesRequest(page: Int): Request = GET("$baseUrl/manga/newest?offset=${20 * (page - 1)}")
+
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
val url = if (query.isNotEmpty()) {
"$baseUrl/?do=search&subaction=search&story=$query&search_start=$page"
@@ -55,6 +57,7 @@ class HenChan : MultiChan("HenChan", "http://y.hchan.live", "ru"), ConfigurableS
genres += (if (f.isExcluded()) "-" else "") + f.id + '+'
}
}
+
else -> return@forEach
}
}
@@ -65,6 +68,7 @@ class HenChan : MultiChan("HenChan", "http://y.hchan.live", "ru"), ConfigurableS
is OrderBy -> {
order = filter.toUriPartWithGenres()
}
+
else -> return@forEach
}
}
@@ -75,6 +79,7 @@ class HenChan : MultiChan("HenChan", "http://y.hchan.live", "ru"), ConfigurableS
is OrderBy -> {
order = filter.toUriPartWithoutGenres()
}
+
else -> return@forEach
}
}
@@ -304,10 +309,12 @@ class HenChan : MultiChan("HenChan", "http://y.hchan.live", "ru"), ConfigurableS
Genre("rpg"),
Genre("scat"),
Genre("shemale"),
+ Genre("shimaidon"),
Genre("shooter"),
Genre("simulation"),
Genre("skinsuit"),
Genre("tomboy"),
+ Genre("tomgirl"),
Genre("x-ray"),
Genre("алкоголь"),
Genre("анал"),
@@ -346,7 +353,6 @@ class HenChan : MultiChan("HenChan", "http://y.hchan.live", "ru"), ConfigurableS
Genre("гг_парень"),
Genre("гипноз"),
Genre("глубокий_минет"),
- Genre("горничные"),
Genre("горячий_источник"),
Genre("грудастая_лоли"),
Genre("групповой_секс"),
@@ -386,6 +392,7 @@ class HenChan : MultiChan("HenChan", "http://y.hchan.live", "ru"), ConfigurableS
Genre("мать"),
Genre("мейдочки"),
Genre("мерзкий_дядька"),
+ Genre("минет"),
Genre("много_девушек"),
Genre("молоко"),
Genre("монашки"),
@@ -400,8 +407,10 @@ class HenChan : MultiChan("HenChan", "http://y.hchan.live", "ru"), ConfigurableS
Genre("новелла"),
Genre("обмен_партнерами"),
Genre("обмен_телами"),
+ Genre("обычный_секс"),
Genre("огромная_грудь"),
Genre("огромный_член"),
+ Genre("оплодотворение"),
Genre("остановка_времени"),
Genre("парень_пассив"),
Genre("переодевание"),
@@ -411,6 +420,7 @@ class HenChan : MultiChan("HenChan", "http://y.hchan.live", "ru"), ConfigurableS
Genre("подглядывание"),
Genre("подчинение"),
Genre("похищение"),
+ Genre("презерватив"),
Genre("принуждение"),
Genre("прозрачная_одежда"),
Genre("проникновение_в_матку"),
@@ -432,12 +442,14 @@ class HenChan : MultiChan("HenChan", "http://y.hchan.live", "ru"), ConfigurableS
Genre("толстушки"),
Genre("трап"),
Genre("тётя"),
+ Genre("умеренная_жестокость"),
Genre("учитель_и_ученик"),
Genre("ушастые"),
Genre("фантазии"),
Genre("фантастика"),
Genre("фемдом"),
Genre("фестиваль"),
+ Genre("фетиш"),
Genre("фистинг"),
Genre("фурри"),
Genre("футанари"),
@@ -452,6 +464,7 @@ class HenChan : MultiChan("HenChan", "http://y.hchan.live", "ru"), ConfigurableS
Genre("школьники"),
Genre("школьницы"),
Genre("школьный_купальник"),
+ Genre("щекотка"),
Genre("эксгибиционизм"),
Genre("эльфы"),
Genre("эччи"),
@@ -470,8 +483,13 @@ class HenChan : MultiChan("HenChan", "http://y.hchan.live", "ru"), ConfigurableS
dialogTitle = DOMAIN_TITLE
setOnPreferenceChangeListener { _, newValue ->
try {
- val res = preferences.edit().putString(DOMAIN_TITLE, newValue as String).commit()
- Toast.makeText(screen.context, "Для смены домена необходимо перезапустить приложение с полной остановкой.", Toast.LENGTH_LONG).show()
+ val res =
+ preferences.edit().putString(DOMAIN_TITLE, newValue as String).commit()
+ Toast.makeText(
+ screen.context,
+ "Для смены домена необходимо перезапустить приложение с полной остановкой.",
+ Toast.LENGTH_LONG,
+ ).show()
res
} catch (e: Exception) {
e.printStackTrace()
@@ -483,6 +501,6 @@ class HenChan : MultiChan("HenChan", "http://y.hchan.live", "ru"), ConfigurableS
companion object {
private const val DOMAIN_TITLE = "Домен"
- private const val DOMAIN_DEFAULT = "http://y.hchan.live"
+ private const val DOMAIN_DEFAULT = "https://xxxxx.hentaichan.live"
}
}
diff --git a/multisrc/overrides/mymangacms/default/AndroidManifest.xml b/multisrc/overrides/mymangacms/default/AndroidManifest.xml
index 8a95129799..29f5f8a850 100644
--- a/multisrc/overrides/mymangacms/default/AndroidManifest.xml
+++ b/multisrc/overrides/mymangacms/default/AndroidManifest.xml
@@ -1,6 +1,5 @@
-
+
-
\ No newline at end of file
+
diff --git a/multisrc/overrides/mymangacms/lkdtt/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/mymangacms/lkdtt/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index c42b4063a4..0000000000
Binary files a/multisrc/overrides/mymangacms/lkdtt/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mymangacms/lkdtt/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/mymangacms/lkdtt/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index b2150bb896..0000000000
Binary files a/multisrc/overrides/mymangacms/lkdtt/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mymangacms/lkdtt/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/mymangacms/lkdtt/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index dc243cd2aa..0000000000
Binary files a/multisrc/overrides/mymangacms/lkdtt/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mymangacms/lkdtt/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/mymangacms/lkdtt/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 580330e4f4..0000000000
Binary files a/multisrc/overrides/mymangacms/lkdtt/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mymangacms/lkdtt/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/mymangacms/lkdtt/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 1d00d37442..0000000000
Binary files a/multisrc/overrides/mymangacms/lkdtt/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/mymangacms/lkdtt/res/web_hi_res_512.png b/multisrc/overrides/mymangacms/lkdtt/res/web_hi_res_512.png
deleted file mode 100644
index 57120ab13f..0000000000
Binary files a/multisrc/overrides/mymangacms/lkdtt/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/mymangacms/lkdtt/src/LKDTT.kt b/multisrc/overrides/mymangacms/lkdtt/src/LKDTT.kt
deleted file mode 100644
index e1a87aca3f..0000000000
--- a/multisrc/overrides/mymangacms/lkdtt/src/LKDTT.kt
+++ /dev/null
@@ -1,121 +0,0 @@
-package eu.kanade.tachiyomi.extension.vi.lkdtt
-
-import eu.kanade.tachiyomi.multisrc.mymangacms.MyMangaCMS
-import java.text.SimpleDateFormat
-import java.util.Locale
-import java.util.TimeZone
-
-class LKDTT : MyMangaCMS("LKDTT", "https://lkdttee.com", "vi") {
- override val dateFormatter = SimpleDateFormat("dd/MM/yy", Locale.US).apply {
- timeZone = TimeZone.getTimeZone(super.timeZone)
- }
-
- override fun dateUpdatedParser(date: String): Long =
- runCatching { super.dateUpdatedParser(date.split(" - ")[1]) }.getOrNull() ?: 0L
-
- override fun getGenreList() = listOf(
- Genre("Học đường", 1),
- Genre("Hài hước", 2),
- Genre("Cổ Đại", 3),
- Genre("Hiện đại", 4),
- Genre("Kinh dị", 5),
- Genre("Tổng tài", 6),
- Genre("Xuyên không", 7),
- Genre("Manhua", 8),
- Genre("Manhwa", 9),
- Genre("Mystery", 10),
- Genre("One shot", 11),
- Genre("Smut", 12),
- Genre("Webtoon", 13),
- Genre("Yaoi", 14),
- Genre("Yuri", 15),
- Genre("Trinh Thám", 16),
- Genre("Tình Cảm", 17),
- Genre("Drama", 18),
- Genre("Comedy", 19),
- Genre("Fantasy", 20),
- Genre("Novel", 21),
- Genre("Action", 22),
- Genre("Manga", 23),
- Genre("Đam Mỹ", 24),
- Genre("Trọng Sinh", 25),
- Genre("Ngôn Tình", 26),
- Genre("Phiêu Lưu", 27),
- Genre("Boy Love", 28),
- Genre("giới giải trí", 29),
- Genre("đô thị", 30),
- Genre("Romance", 31),
- Genre("Đô Thị", 32),
- Genre("Shoujo", 33),
- Genre("Historical", 34),
- Genre("Slice of life", 35),
- Genre("Mature", 36),
- Genre("GL", 37),
- Genre("Adult", 38),
- Genre("Huyền huyễn", 39),
- Genre("Baby", 40),
- Genre("Tragedy", 41),
- Genre("Truyện Màu", 42),
- Genre("School Life", 43),
- Genre("Josei", 44),
- Genre("Oneshot", 45),
- Genre("Gender Bender", 46),
- Genre("Nữ cường", 47),
- Genre("Harem", 48),
- Genre("Reverse Harem", 49),
- Genre("Isekai", 50),
- Genre("Adventure", 51),
- Genre("Chuyển Sinh", 52),
- Genre("Đại Nữ Chủ", 53),
- Genre("Shounen", 54),
- Genre("Sports", 55),
- Genre("Sủng Ngọt", 56),
- Genre("Truyện 18+", 57),
- Genre("Trung Cổ", 58),
- Genre("Ma Thuật", 59),
- Genre("Webtoons", 60),
- Genre("Xuyên", 61),
- Genre("Ngôn", 62),
- Genre("Tiểu Bạch Thỏ", 63),
- Genre("Sủng", 65),
- Genre("Trùng Sinh", 66),
- Genre("Ma Cà Rồng", 67),
- Genre("Tái Sinh", 68),
- Genre("Quân Nhân", 69),
- Genre("Showbiz", 70),
- Genre("Comic", 71),
- Genre("Phép Thuật", 72),
- Genre("Psychological", 73),
- Genre("Supernatural", 74),
- Genre("Lãng Mạn", 75),
- Genre("Gender", 76),
- Genre("Bender", 77),
- Genre("Vườn Trường", 78),
- Genre("Magic", 79),
- Genre("Nhân Thú", 80),
- Genre("Soft Yaoi", 81),
- Genre("Hôn Nhân Hợp Đồng", 82),
- Genre("Cưới Trước Yêu Sau", 83),
- Genre("Bi Kịch", 84),
- Genre("Horror", 85),
- Genre("Reincarnation", 86),
- Genre("Hồi Sinh", 87),
- Genre("Hoàng Gia", 88),
- Genre("Giả Tưởng", 89),
- Genre("Xuyên Sách", 90),
- Genre("Hài", 91),
- Genre("Ngọt", 92),
- Genre("Nam Cường", 93),
- Genre("Chủ Nam", 94),
- Genre("Minh Tinh", 95),
- Genre("Cổ Trang", 96),
- Genre("Xuyên Game", 97),
- Genre("Villainess", 98),
- Genre("Cung Đấu", 99),
- Genre("Hành Động", 100),
- Genre("Truyện Tranh", 101),
- Genre("Adaptation", 102),
- Genre("Magi", 103),
- Genre("Âu Cổ", 104),
- )
-}
diff --git a/multisrc/overrides/nepnep/mangasee/AndroidManifest.xml b/multisrc/overrides/nepnep/mangasee/AndroidManifest.xml
index f2bfc55a6a..4dd2c5b71f 100644
--- a/multisrc/overrides/nepnep/mangasee/AndroidManifest.xml
+++ b/multisrc/overrides/nepnep/mangasee/AndroidManifest.xml
@@ -1,7 +1,6 @@
-
-
+
+
-
+
-
+
-
diff --git a/multisrc/overrides/readallcomics/readallcomicscom/src/ReadAllComicsCom.kt b/multisrc/overrides/readallcomics/readallcomicscom/src/ReadAllComicsCom.kt
index 9819226c4b..967ab5a892 100644
--- a/multisrc/overrides/readallcomics/readallcomicscom/src/ReadAllComicsCom.kt
+++ b/multisrc/overrides/readallcomics/readallcomicscom/src/ReadAllComicsCom.kt
@@ -17,6 +17,8 @@ class ReadAllComicsCom : ReadAllComics("ReadAllComics", "https://readallcomics.c
}
}
+ override fun pageListSelector() = "body img:not(body div[id=\"logo\"] img)"
+
companion object {
private val titleRegex = Regex("""^([a-zA-Z_.\s\-–:]*)""")
}
diff --git a/multisrc/overrides/readerfront/default/AndroidManifest.xml b/multisrc/overrides/readerfront/default/AndroidManifest.xml
index 1fce661c89..b53f52f6e4 100644
--- a/multisrc/overrides/readerfront/default/AndroidManifest.xml
+++ b/multisrc/overrides/readerfront/default/AndroidManifest.xml
@@ -1,6 +1,5 @@
-
+
().getSharedPreferences("source_$id", 0x0000)
+ }
+
+ private var domain: String? = if (preferences.getBoolean(redirect_PREF, true)) "https://senkognito.com" else "https://senkuro.com"
+ override val baseUrl: String = domain.toString()
+ override fun setupPreferenceScreen(screen: androidx.preference.PreferenceScreen) {
+ val domainRedirect = androidx.preference.CheckBoxPreference(screen.context).apply {
+ key = redirect_PREF
+ title = "Домен Senkognito"
+ summary = "Отключите если домен Senkognito недоступен в браузере/WebView."
+ setDefaultValue(true)
+ setOnPreferenceChangeListener { _, newValue ->
+ val warning = "Для смены домена необходимо перезапустить приложение с полной остановкой."
+ Toast.makeText(screen.context, warning, Toast.LENGTH_LONG).show()
+ true
+ }
+ }
+ screen.addPreference(domainRedirect)
+ }
+
+ companion object {
+ private const val redirect_PREF = "domainRedirect"
+ }
+}
diff --git a/multisrc/overrides/senkuro/senkuro/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/senkuro/senkuro/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..c7b04fec43
Binary files /dev/null and b/multisrc/overrides/senkuro/senkuro/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/senkuro/senkuro/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/senkuro/senkuro/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..1452cbd4cc
Binary files /dev/null and b/multisrc/overrides/senkuro/senkuro/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/senkuro/senkuro/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/senkuro/senkuro/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..37820c9a83
Binary files /dev/null and b/multisrc/overrides/senkuro/senkuro/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/senkuro/senkuro/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/senkuro/senkuro/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..944881d337
Binary files /dev/null and b/multisrc/overrides/senkuro/senkuro/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/senkuro/senkuro/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/senkuro/senkuro/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..b4dac12d20
Binary files /dev/null and b/multisrc/overrides/senkuro/senkuro/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/senkuro/senkuro/res/web_hi_res_512.png b/multisrc/overrides/senkuro/senkuro/res/web_hi_res_512.png
new file mode 100644
index 0000000000..359430854a
Binary files /dev/null and b/multisrc/overrides/senkuro/senkuro/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/senkuro/senkuro/src/Senkuro.kt b/multisrc/overrides/senkuro/senkuro/src/Senkuro.kt
new file mode 100644
index 0000000000..31a1645b5c
--- /dev/null
+++ b/multisrc/overrides/senkuro/senkuro/src/Senkuro.kt
@@ -0,0 +1,8 @@
+package eu.kanade.tachiyomi.extension.ru.senkuro
+
+import androidx.preference.PreferenceScreen
+import eu.kanade.tachiyomi.multisrc.senkuro.Senkuro
+
+class Senkuro : Senkuro("Senkuro", "https://senkuro.com", "ru") {
+ override fun setupPreferenceScreen(screen: PreferenceScreen) {}
+}
diff --git a/multisrc/overrides/sinmh/qinqin/src/Qinqin.kt b/multisrc/overrides/sinmh/qinqin/src/Qinqin.kt
index 93044f834a..7003282f1d 100644
--- a/multisrc/overrides/sinmh/qinqin/src/Qinqin.kt
+++ b/multisrc/overrides/sinmh/qinqin/src/Qinqin.kt
@@ -9,7 +9,7 @@ import javax.crypto.Cipher
import javax.crypto.spec.IvParameterSpec
import javax.crypto.spec.SecretKeySpec
-class Qinqin : SinMH("亲亲漫画", "https://www.acgqd.com") {
+class Qinqin : SinMH("亲亲漫画", "https://www.acgud.com") {
override fun popularMangaRequest(page: Int) = GET("$baseUrl/list/post/?page=$page", headers)
@@ -17,7 +17,7 @@ class Qinqin : SinMH("亲亲漫画", "https://www.acgqd.com") {
override fun Elements.sectionsDescending() = this
- // https://www.acgqd.com/js/jmzz20191018.js
+ // https://www.acgud.com/js/jmzz20191018.js
override fun parsePageImages(chapterImages: String): List {
val key = SecretKeySpec("cxNB23W8xzKJV26O".toByteArray(), "AES")
val iv = IvParameterSpec("opb4x7z21vg1f3gI".toByteArray())
diff --git a/multisrc/overrides/webtoons/webtoons/AndroidManifest.xml b/multisrc/overrides/webtoons/webtoons/AndroidManifest.xml
index 14082a252f..1ce564382b 100644
--- a/multisrc/overrides/webtoons/webtoons/AndroidManifest.xml
+++ b/multisrc/overrides/webtoons/webtoons/AndroidManifest.xml
@@ -1,6 +1,5 @@
-
+
SManga.ONGOING
+ contains("TERMINÉ") -> SManga.COMPLETED
+ else -> SManga.UNKNOWN
+ }
+}
+
class WebtoonsZH : WebtoonsSrc("Webtoons.com", "https://www.webtoons.com", "zh-Hant", "zh-hant", "zh_TW", SimpleDateFormat("yyyy/MM/dd", Locale.TRADITIONAL_CHINESE)) {
// Due to lang code getting more specific
override val id: Long = 2959982438613576472
diff --git a/multisrc/overrides/webtoons/webtoons/src/WebtoonsSrc.kt b/multisrc/overrides/webtoons/webtoons/src/WebtoonsSrc.kt
index 77f480844a..0ae869e4ec 100644
--- a/multisrc/overrides/webtoons/webtoons/src/WebtoonsSrc.kt
+++ b/multisrc/overrides/webtoons/webtoons/src/WebtoonsSrc.kt
@@ -57,10 +57,10 @@ open class WebtoonsSrc(
var pages = document.select("div#_imageList > img").mapIndexed { i, element -> Page(i, "", element.attr("data-url")) }
if (showAuthorsNotesPref()) {
- val note = document.select("div.comment_area div.info_area p").text()
+ val note = document.select("div.creator_note p.author_text").text()
if (note.isNotEmpty()) {
- val creator = document.select("div.creator_note span.author a").text().trim()
+ val creator = document.select("div.creator_note a.author_name span").text().trim()
pages = pages + Page(
pages.size,
diff --git a/multisrc/overrides/wpcomics/nettruyen/src/NetTruyen.kt b/multisrc/overrides/wpcomics/nettruyen/src/NetTruyen.kt
index d762c8f05e..8858284814 100644
--- a/multisrc/overrides/wpcomics/nettruyen/src/NetTruyen.kt
+++ b/multisrc/overrides/wpcomics/nettruyen/src/NetTruyen.kt
@@ -9,7 +9,7 @@ import okhttp3.Request
import java.text.SimpleDateFormat
import java.util.Locale
-class NetTruyen : WPComics("NetTruyen", "https://www.nettruyenmax.com", "vi", SimpleDateFormat("dd/MM/yy", Locale.getDefault()), null) {
+class NetTruyen : WPComics("NetTruyen", "https://www.nettruyenus.com", "vi", SimpleDateFormat("dd/MM/yy", Locale.getDefault()), null) {
override fun headersBuilder(): Headers.Builder = Headers.Builder()
override fun imageRequest(page: Page): Request = GET(page.imageUrl!!, headersBuilder().add("Referer", baseUrl).build())
override fun getFilterList(): FilterList {
diff --git a/multisrc/overrides/wpcomics/nhattruyen/src/NhatTruyen.kt b/multisrc/overrides/wpcomics/nhattruyen/src/NhatTruyen.kt
index 87ef107c31..210eb0c087 100644
--- a/multisrc/overrides/wpcomics/nhattruyen/src/NhatTruyen.kt
+++ b/multisrc/overrides/wpcomics/nhattruyen/src/NhatTruyen.kt
@@ -9,7 +9,7 @@ import okhttp3.Request
import java.text.SimpleDateFormat
import java.util.Locale
-class NhatTruyen : WPComics("NhatTruyen", "https://nhattruyenmin.com", "vi", SimpleDateFormat("dd/MM/yy", Locale.getDefault()), null) {
+class NhatTruyen : WPComics("NhatTruyen", "https://nhattruyenplus.com", "vi", SimpleDateFormat("dd/MM/yy", Locale.getDefault()), null) {
override fun headersBuilder(): Headers.Builder = Headers.Builder()
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request = GET("$baseUrl/the-loai?keyword=$query&page=$page", headers)
override fun imageRequest(page: Page): Request = GET(page.imageUrl!!, headersBuilder().add("Referer", baseUrl).build())
diff --git a/multisrc/overrides/zeistmanga/animexnovel/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/zeistmanga/animexnovel/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..dd4c016e36
Binary files /dev/null and b/multisrc/overrides/zeistmanga/animexnovel/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/zeistmanga/animexnovel/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/zeistmanga/animexnovel/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..d45ea5affe
Binary files /dev/null and b/multisrc/overrides/zeistmanga/animexnovel/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/zeistmanga/animexnovel/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/zeistmanga/animexnovel/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..c29b6ef6ee
Binary files /dev/null and b/multisrc/overrides/zeistmanga/animexnovel/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/zeistmanga/animexnovel/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/zeistmanga/animexnovel/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..3ea4ba5a1a
Binary files /dev/null and b/multisrc/overrides/zeistmanga/animexnovel/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/zeistmanga/animexnovel/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/zeistmanga/animexnovel/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..53c2248d96
Binary files /dev/null and b/multisrc/overrides/zeistmanga/animexnovel/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/zeistmanga/animexnovel/res/web_hi_res_512.png b/multisrc/overrides/zeistmanga/animexnovel/res/web_hi_res_512.png
new file mode 100644
index 0000000000..1d9e5f43bb
Binary files /dev/null and b/multisrc/overrides/zeistmanga/animexnovel/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/zeistmanga/animexnovel/src/AnimeXNovel.kt b/multisrc/overrides/zeistmanga/animexnovel/src/AnimeXNovel.kt
new file mode 100644
index 0000000000..2968737b28
--- /dev/null
+++ b/multisrc/overrides/zeistmanga/animexnovel/src/AnimeXNovel.kt
@@ -0,0 +1,41 @@
+package eu.kanade.tachiyomi.extension.pt.animexnovel
+
+import eu.kanade.tachiyomi.multisrc.zeistmanga.ZeistManga
+import eu.kanade.tachiyomi.source.model.MangasPage
+import eu.kanade.tachiyomi.source.model.SChapter
+import eu.kanade.tachiyomi.source.model.SManga
+import eu.kanade.tachiyomi.util.asJsoup
+import okhttp3.Response
+
+class AnimeXNovel : ZeistManga("AnimeXNovel", "https://www.animexnovel.com", "pt-BR") {
+
+ override val mangaCategory: String = "Manga"
+
+ override fun popularMangaParse(response: Response): MangasPage {
+ val document = response.asJsoup()
+ val mangas = document.select("div.PopularPosts div.grid > figure").map { element ->
+ SManga.create().apply {
+ thumbnail_url = element.selectFirst("img")!!.attr("abs:src")
+ title = element.selectFirst("figcaption > a")!!.text()
+ setUrlWithoutDomain(element.selectFirst("figcaption > a")!!.attr("href"))
+ }
+ }.filter { it.title.contains("[Mangá]") }
+
+ return MangasPage(mangas, false)
+ }
+
+ override val mangaDetailsSelectorDescription = "div.bc-fff.s1 > h3:contains(Sinopse) ~ div[style=text-align: justify;]"
+
+ private val chapterListSelector = "div:has(> .list-judul:contains(Lista de Capítulos)) div#latest ul > li, div.tab:has(> label:contains(Lista de Capítulos)) div.tab-content ul > li"
+
+ override fun chapterListParse(response: Response): List {
+ val document = response.asJsoup()
+ val chapters = document.select(chapterListSelector)
+ return chapters.map {
+ SChapter.create().apply {
+ name = it.select("a").text()
+ setUrlWithoutDomain(it.select("a").attr("href"))
+ }
+ }
+ }
+}
diff --git a/multisrc/overrides/zeistmanga/datgarscanlation/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/zeistmanga/datgarscanlation/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index 2c043a5d9b..0000000000
Binary files a/multisrc/overrides/zeistmanga/datgarscanlation/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/zeistmanga/datgarscanlation/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/zeistmanga/datgarscanlation/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index 90af3d5d49..0000000000
Binary files a/multisrc/overrides/zeistmanga/datgarscanlation/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/zeistmanga/datgarscanlation/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/zeistmanga/datgarscanlation/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index a3d613f210..0000000000
Binary files a/multisrc/overrides/zeistmanga/datgarscanlation/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/zeistmanga/datgarscanlation/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/zeistmanga/datgarscanlation/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index f2a1acae9e..0000000000
Binary files a/multisrc/overrides/zeistmanga/datgarscanlation/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/zeistmanga/datgarscanlation/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/zeistmanga/datgarscanlation/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 2d1bb27088..0000000000
Binary files a/multisrc/overrides/zeistmanga/datgarscanlation/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/zeistmanga/datgarscanlation/res/web_hi_res_512.png b/multisrc/overrides/zeistmanga/datgarscanlation/res/web_hi_res_512.png
deleted file mode 100644
index 7795824b82..0000000000
Binary files a/multisrc/overrides/zeistmanga/datgarscanlation/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/overrides/zeistmanga/datgarscanlation/src/DatGarScanlation.kt b/multisrc/overrides/zeistmanga/datgarscanlation/src/DatGarScanlation.kt
deleted file mode 100644
index 1f9e3d9602..0000000000
--- a/multisrc/overrides/zeistmanga/datgarscanlation/src/DatGarScanlation.kt
+++ /dev/null
@@ -1,39 +0,0 @@
-package eu.kanade.tachiyomi.extension.es.datgarscanlation
-
-import eu.kanade.tachiyomi.multisrc.zeistmanga.Language
-import eu.kanade.tachiyomi.multisrc.zeistmanga.ZeistManga
-import org.jsoup.nodes.Document
-
-class DatGarScanlation : ZeistManga("DatGarScanlation", "https://datgarscanlation.blogspot.com", "es") {
-
- override val hasFilters = true
-
- private val altChapterFeedRegex = """label\s*=\s*'([^']+)'""".toRegex()
- private val altScriptSelector = "#latest > script"
-
- override fun getApiUrl(doc: Document): String {
- var chapterRegex = chapterFeedRegex
- var script = doc.selectFirst(scriptSelector)
-
- if (script == null) {
- script = doc.selectFirst(altScriptSelector)!!
- chapterRegex = altChapterFeedRegex
- }
-
- val feed = chapterRegex
- .find(script.html())
- ?.groupValues?.get(1)
- ?: throw Exception("Failed to find chapter feed")
-
- val url = apiUrl(feed)
- .addQueryParameter("start-index", "2") // Only get chapters
- .addQueryParameter("max-results", "999999") // Get all chapters
- .build()
-
- return url.toString()
- }
-
- override fun getLanguageList(): List = listOf(
- Language(intl.all, ""),
- )
-}
diff --git a/multisrc/overrides/zeistmanga/elevenscanlator/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/zeistmanga/elevenscanlator/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..edab19abfa
Binary files /dev/null and b/multisrc/overrides/zeistmanga/elevenscanlator/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/zeistmanga/elevenscanlator/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/zeistmanga/elevenscanlator/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..a5bc08cc45
Binary files /dev/null and b/multisrc/overrides/zeistmanga/elevenscanlator/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/zeistmanga/elevenscanlator/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/zeistmanga/elevenscanlator/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..958bd9913d
Binary files /dev/null and b/multisrc/overrides/zeistmanga/elevenscanlator/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/zeistmanga/elevenscanlator/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/zeistmanga/elevenscanlator/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..4598836c4e
Binary files /dev/null and b/multisrc/overrides/zeistmanga/elevenscanlator/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/zeistmanga/elevenscanlator/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/zeistmanga/elevenscanlator/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..bbc622fb67
Binary files /dev/null and b/multisrc/overrides/zeistmanga/elevenscanlator/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/zeistmanga/elevenscanlator/res/web_hi_res_512.png b/multisrc/overrides/zeistmanga/elevenscanlator/res/web_hi_res_512.png
new file mode 100644
index 0000000000..a5fb63c5d6
Binary files /dev/null and b/multisrc/overrides/zeistmanga/elevenscanlator/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/zeistmanga/guildatierdraw/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/zeistmanga/guildatierdraw/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..514dd275d3
Binary files /dev/null and b/multisrc/overrides/zeistmanga/guildatierdraw/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/zeistmanga/guildatierdraw/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/zeistmanga/guildatierdraw/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..a646eb2e38
Binary files /dev/null and b/multisrc/overrides/zeistmanga/guildatierdraw/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/zeistmanga/guildatierdraw/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/zeistmanga/guildatierdraw/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..e0e8390a80
Binary files /dev/null and b/multisrc/overrides/zeistmanga/guildatierdraw/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/zeistmanga/guildatierdraw/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/zeistmanga/guildatierdraw/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..ca69b02953
Binary files /dev/null and b/multisrc/overrides/zeistmanga/guildatierdraw/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/zeistmanga/guildatierdraw/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/zeistmanga/guildatierdraw/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..dfb208bc9f
Binary files /dev/null and b/multisrc/overrides/zeistmanga/guildatierdraw/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/zeistmanga/guildatierdraw/res/web_hi_res_512.png b/multisrc/overrides/zeistmanga/guildatierdraw/res/web_hi_res_512.png
new file mode 100644
index 0000000000..db4eb55a5a
Binary files /dev/null and b/multisrc/overrides/zeistmanga/guildatierdraw/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/zeistmanga/guildatierdraw/src/GuildaTierDraw.kt b/multisrc/overrides/zeistmanga/guildatierdraw/src/GuildaTierDraw.kt
new file mode 100644
index 0000000000..3b5f7bee62
--- /dev/null
+++ b/multisrc/overrides/zeistmanga/guildatierdraw/src/GuildaTierDraw.kt
@@ -0,0 +1,7 @@
+package eu.kanade.tachiyomi.extension.pt.guildatierdraw
+
+import eu.kanade.tachiyomi.multisrc.zeistmanga.ZeistManga
+
+class GuildaTierDraw : ZeistManga("Guilda Tier Draw", "https://www.guildatierdraw.com", "pt-BR") {
+ override val mangaDetailsSelectorDescription = "#Sinopse"
+}
diff --git a/multisrc/overrides/zeistmanga/hijala/src/Hijala.kt b/multisrc/overrides/zeistmanga/hijala/src/Hijala.kt
index a2920a9e8c..8edb8d68ab 100644
--- a/multisrc/overrides/zeistmanga/hijala/src/Hijala.kt
+++ b/multisrc/overrides/zeistmanga/hijala/src/Hijala.kt
@@ -1,16 +1,20 @@
package eu.kanade.tachiyomi.extension.ar.hijala
import eu.kanade.tachiyomi.multisrc.zeistmanga.Genre
-import eu.kanade.tachiyomi.multisrc.zeistmanga.Language
import eu.kanade.tachiyomi.multisrc.zeistmanga.ZeistManga
+import eu.kanade.tachiyomi.source.model.MangasPage
+import okhttp3.Request
+import okhttp3.Response
class Hijala : ZeistManga("Hijala", "https://hijala.blogspot.com", "ar") {
override val hasFilters = true
+ override val hasLanguageFilter = false
- override fun getLanguageList(): List = listOf(
- Language(intl.all, ""),
- )
+ override val supportsLatest = false
+
+ override fun popularMangaRequest(page: Int): Request = latestUpdatesRequest(page)
+ override fun popularMangaParse(response: Response): MangasPage = latestUpdatesParse(response)
override fun getGenreList(): List = listOf(
Genre("أكشن", "Action"),
diff --git a/multisrc/overrides/zeistmanga/klmanhua/src/KLManhua.kt b/multisrc/overrides/zeistmanga/klmanhua/src/KLManhua.kt
index 8b34b50b1c..dc150c0228 100644
--- a/multisrc/overrides/zeistmanga/klmanhua/src/KLManhua.kt
+++ b/multisrc/overrides/zeistmanga/klmanhua/src/KLManhua.kt
@@ -1,13 +1,9 @@
package eu.kanade.tachiyomi.extension.id.klmanhua
-import eu.kanade.tachiyomi.multisrc.zeistmanga.Language
import eu.kanade.tachiyomi.multisrc.zeistmanga.ZeistManga
class KLManhua : ZeistManga("KLManhua", "https://klmanhua.blogspot.com", "id") {
override val hasFilters = true
-
- override fun getLanguageList(): List = listOf(
- Language(intl.all, ""),
- )
+ override val hasLanguageFilter = false
}
diff --git a/multisrc/overrides/zeistmanga/komikrealm/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/zeistmanga/komikrealm/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..04e0b06c1a
Binary files /dev/null and b/multisrc/overrides/zeistmanga/komikrealm/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/zeistmanga/komikrealm/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/zeistmanga/komikrealm/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..8fe0d409c7
Binary files /dev/null and b/multisrc/overrides/zeistmanga/komikrealm/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/zeistmanga/komikrealm/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/zeistmanga/komikrealm/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..1f43d3b13c
Binary files /dev/null and b/multisrc/overrides/zeistmanga/komikrealm/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/zeistmanga/komikrealm/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/zeistmanga/komikrealm/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..e9e807cbb6
Binary files /dev/null and b/multisrc/overrides/zeistmanga/komikrealm/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/zeistmanga/komikrealm/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/zeistmanga/komikrealm/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..297bf1665a
Binary files /dev/null and b/multisrc/overrides/zeistmanga/komikrealm/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/zeistmanga/komikrealm/res/web_hi_res_512.png b/multisrc/overrides/zeistmanga/komikrealm/res/web_hi_res_512.png
new file mode 100644
index 0000000000..ab0a2dfc4a
Binary files /dev/null and b/multisrc/overrides/zeistmanga/komikrealm/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/zeistmanga/komikrealm/src/KomikRealm.kt b/multisrc/overrides/zeistmanga/komikrealm/src/KomikRealm.kt
new file mode 100644
index 0000000000..bef6676cf6
--- /dev/null
+++ b/multisrc/overrides/zeistmanga/komikrealm/src/KomikRealm.kt
@@ -0,0 +1,146 @@
+package eu.kanade.tachiyomi.extension.id.komikrealm
+
+import eu.kanade.tachiyomi.multisrc.zeistmanga.Genre
+import eu.kanade.tachiyomi.multisrc.zeistmanga.Status
+import eu.kanade.tachiyomi.multisrc.zeistmanga.Type
+import eu.kanade.tachiyomi.multisrc.zeistmanga.ZeistManga
+import eu.kanade.tachiyomi.multisrc.zeistmanga.ZeistMangaDto
+import eu.kanade.tachiyomi.multisrc.zeistmanga.ZeistMangaIntl
+import eu.kanade.tachiyomi.network.GET
+import eu.kanade.tachiyomi.source.model.MangasPage
+import eu.kanade.tachiyomi.source.model.Page
+import eu.kanade.tachiyomi.source.model.SChapter
+import eu.kanade.tachiyomi.source.model.SManga
+import eu.kanade.tachiyomi.util.asJsoup
+import kotlinx.serialization.decodeFromString
+import kotlinx.serialization.json.Json
+import okhttp3.Request
+import okhttp3.Response
+import org.jsoup.nodes.Document
+import uy.kohesive.injekt.injectLazy
+
+class KomikRealm : ZeistManga(
+ "KomikRealm",
+ "https://www.komikrealm.my.id",
+ "id",
+) {
+ private val json: Json by injectLazy()
+
+ override val hasFilters = true
+
+ override val hasLanguageFilter = false
+
+ override val chapterCategory = ""
+
+ override fun popularMangaRequest(page: Int): Request {
+ val url = apiUrl("Project")
+ .addQueryParameter("orderby", "updated")
+ .addQueryParameter("max-results", "12")
+ .build()
+
+ return GET(url, headers)
+ }
+
+ override fun popularMangaParse(response: Response): MangasPage {
+ val jsonString = response.body.string()
+ val result = json.decodeFromString(jsonString)
+
+ val mangas = result.feed?.entry.orEmpty()
+ .filter { it.category.orEmpty().any { category -> category.term == "Series" } }
+ .filter { !it.category.orEmpty().any { category -> category.term == "Anime" } }
+ .map { it.toSManga(baseUrl) }
+
+ return MangasPage(mangas, false)
+ }
+
+ override fun mangaDetailsParse(response: Response): SManga {
+ val document = response.asJsoup()
+ val profileManga = document.select(".bigcontent")
+ val infoManga = profileManga.select("ul.infonime li")
+
+ return SManga.create().apply {
+ thumbnail_url = profileManga.select("img").first()!!.attr("data-src")
+ description = profileManga.select(".sinoposis").text()
+ genre = profileManga.select("div.info-genre > a[rel=tag]")
+ .joinToString { it.text() }
+
+ infoManga.forEach {
+ val title = it.select("b").text()
+ val desc = it.select("span").text()
+
+ when (title) {
+ "Status" -> status = parseStatus(desc)
+ "Author" -> author = desc
+ "Artist" -> artist = desc
+ }
+ }
+ }
+ }
+
+ override fun chapterListParse(response: Response): List {
+ val document = response.asJsoup()
+
+ val url = getChapterFeedUrl(document)
+
+ val req = GET(url, headers)
+ val res = client.newCall(req).execute()
+
+ val jsonString = res.body.string()
+ val result = json.decodeFromString(jsonString)
+
+ return result.feed?.entry
+ ?.filter {
+ !it.category.orEmpty().any { category ->
+ category.term == "Series"
+ }
+ }
+ ?.map { it.toSChapter(baseUrl) }
+ ?: throw Exception("Failed to parse from chapter API")
+ }
+
+ private val imagePageRegex = """(http|https)://[^"]+""".toRegex()
+
+ override fun pageListParse(response: Response): List {
+ val document = response.asJsoup()
+ val script = document.select(".post-body > script").html()
+ val matches = imagePageRegex.findAll(script)
+ return matches.mapIndexed { i, match ->
+ Page(i, "", match.value)
+ }.toList()
+ }
+
+ private val labelChapterRegex = """var label_chapter = "([^"]+)";""".toRegex()
+
+ override fun getChapterFeedUrl(doc: Document): String {
+ val script = doc.select(".post-body > script")
+ val feed = labelChapterRegex.find(script.html())
+ ?.groupValues?.get(1)
+ ?: throw Exception("Failed to find chapter feed")
+
+ return apiUrl(chapterCategory)
+ .addPathSegments(feed)
+ .addQueryParameter("max-results", "999999")
+ .build().toString()
+ }
+
+ private val intl by lazy { ZeistMangaIntl(lang) }
+
+ override fun getStatusList(): List = listOf(
+ Status(intl.all, ""),
+ Status(intl.statusOngoing, "Ongoing"),
+ Status(intl.statusCompleted, "Completed"),
+ )
+
+ override fun getTypeList(): List = listOf(
+ Type(intl.all, ""),
+ Type(intl.typeManga, "Manga"),
+ Type(intl.typeManhua, "Manhua"),
+ Type(intl.typeManhwa, "Manhwa"),
+ )
+
+ override fun getGenreList(): List = listOf(
+ Genre("Drama", "Drama"),
+ Genre("Mature", "Mature"),
+ Genre("Supernatural", "Supernatural"),
+ )
+}
diff --git a/multisrc/overrides/zeistmanga/lonertranslations/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/zeistmanga/lonertranslations/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..6d2753b61b
Binary files /dev/null and b/multisrc/overrides/zeistmanga/lonertranslations/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/zeistmanga/lonertranslations/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/zeistmanga/lonertranslations/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..4e550b8b13
Binary files /dev/null and b/multisrc/overrides/zeistmanga/lonertranslations/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/zeistmanga/lonertranslations/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/zeistmanga/lonertranslations/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..3e8b896255
Binary files /dev/null and b/multisrc/overrides/zeistmanga/lonertranslations/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/zeistmanga/lonertranslations/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/zeistmanga/lonertranslations/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..0a0278ad1c
Binary files /dev/null and b/multisrc/overrides/zeistmanga/lonertranslations/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/zeistmanga/lonertranslations/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/zeistmanga/lonertranslations/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..a1ad11d0ab
Binary files /dev/null and b/multisrc/overrides/zeistmanga/lonertranslations/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/zeistmanga/lonertranslations/res/web_hi_res_512.png b/multisrc/overrides/zeistmanga/lonertranslations/res/web_hi_res_512.png
new file mode 100644
index 0000000000..2e27d7a46c
Binary files /dev/null and b/multisrc/overrides/zeistmanga/lonertranslations/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/zeistmanga/mangaailand/src/MangaAiLand.kt b/multisrc/overrides/zeistmanga/mangaailand/src/MangaAiLand.kt
index 406781b854..3f87781c2c 100644
--- a/multisrc/overrides/zeistmanga/mangaailand/src/MangaAiLand.kt
+++ b/multisrc/overrides/zeistmanga/mangaailand/src/MangaAiLand.kt
@@ -1,16 +1,14 @@
package eu.kanade.tachiyomi.extension.ar.mangaailand
import eu.kanade.tachiyomi.multisrc.zeistmanga.Genre
-import eu.kanade.tachiyomi.multisrc.zeistmanga.Language
import eu.kanade.tachiyomi.multisrc.zeistmanga.ZeistManga
class MangaAiLand : ZeistManga("Manga Ai Land", "https://manga-ai-land.blogspot.com", "ar") {
override val hasFilters = true
+ override val hasLanguageFilter = false
- override fun getLanguageList(): List = listOf(
- Language(intl.all, ""),
- )
+ override val chapterCategory = "فصل"
override fun getGenreList(): List = listOf(
Genre("تراجيدي", "تراجيدي"),
diff --git a/multisrc/overrides/zeistmanga/mangasoul/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/zeistmanga/mangasoul/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..abd5e9e5ad
Binary files /dev/null and b/multisrc/overrides/zeistmanga/mangasoul/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/zeistmanga/mangasoul/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/zeistmanga/mangasoul/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..f186ffa911
Binary files /dev/null and b/multisrc/overrides/zeistmanga/mangasoul/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/zeistmanga/mangasoul/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/zeistmanga/mangasoul/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..7fc5145fc2
Binary files /dev/null and b/multisrc/overrides/zeistmanga/mangasoul/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/zeistmanga/mangasoul/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/zeistmanga/mangasoul/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..13299100a8
Binary files /dev/null and b/multisrc/overrides/zeistmanga/mangasoul/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/zeistmanga/mangasoul/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/zeistmanga/mangasoul/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..9abc6abaaf
Binary files /dev/null and b/multisrc/overrides/zeistmanga/mangasoul/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/zeistmanga/mangasoul/res/web_hi_res_512.png b/multisrc/overrides/zeistmanga/mangasoul/res/web_hi_res_512.png
new file mode 100644
index 0000000000..4a40c9f31c
Binary files /dev/null and b/multisrc/overrides/zeistmanga/mangasoul/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/zeistmanga/mangasoul/src/MangaSoul.kt b/multisrc/overrides/zeistmanga/mangasoul/src/MangaSoul.kt
new file mode 100644
index 0000000000..42ebc9ba09
--- /dev/null
+++ b/multisrc/overrides/zeistmanga/mangasoul/src/MangaSoul.kt
@@ -0,0 +1,7 @@
+package eu.kanade.tachiyomi.extension.ar.mangasoul
+
+import eu.kanade.tachiyomi.multisrc.zeistmanga.ZeistManga
+
+class MangaSoul : ZeistManga("Manga Soul", "https://www.manga-soul.com", "ar") {
+ override val mangaDetailsSelectorInfo = ".y6x11p, .y6x11p > b > span"
+}
diff --git a/multisrc/overrides/zeistmanga/mikoroku/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/zeistmanga/mikoroku/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..338bae3c67
Binary files /dev/null and b/multisrc/overrides/zeistmanga/mikoroku/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/zeistmanga/mikoroku/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/zeistmanga/mikoroku/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..280f88901f
Binary files /dev/null and b/multisrc/overrides/zeistmanga/mikoroku/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/zeistmanga/mikoroku/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/zeistmanga/mikoroku/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..25495ea8e7
Binary files /dev/null and b/multisrc/overrides/zeistmanga/mikoroku/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/zeistmanga/mikoroku/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/zeistmanga/mikoroku/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..e696c9415e
Binary files /dev/null and b/multisrc/overrides/zeistmanga/mikoroku/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/zeistmanga/mikoroku/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/zeistmanga/mikoroku/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..0fc7946ba8
Binary files /dev/null and b/multisrc/overrides/zeistmanga/mikoroku/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/zeistmanga/mikoroku/res/web_hi_res_512.png b/multisrc/overrides/zeistmanga/mikoroku/res/web_hi_res_512.png
new file mode 100644
index 0000000000..27760ce9fa
Binary files /dev/null and b/multisrc/overrides/zeistmanga/mikoroku/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/zeistmanga/mikoroku/src/MikoRoku.kt b/multisrc/overrides/zeistmanga/mikoroku/src/MikoRoku.kt
new file mode 100644
index 0000000000..28d8944e75
--- /dev/null
+++ b/multisrc/overrides/zeistmanga/mikoroku/src/MikoRoku.kt
@@ -0,0 +1,26 @@
+package eu.kanade.tachiyomi.extension.id.mikoroku
+
+import eu.kanade.tachiyomi.multisrc.zeistmanga.ZeistManga
+import eu.kanade.tachiyomi.source.model.SManga
+import eu.kanade.tachiyomi.util.asJsoup
+import okhttp3.Response
+
+class MikoRoku : ZeistManga("MikoRoku", "https://www.mikoroku.web.id", "id") {
+
+ override val popularMangaSelector = "div.PopularPosts article"
+ override val popularMangaSelectorTitle = ".post-title a"
+ override val popularMangaSelectorUrl = ".post-title a"
+
+ override val pageListSelector = "article#reader div.separator a"
+
+ override fun mangaDetailsParse(response: Response): SManga = SManga.create().apply {
+ val document = response.asJsoup()
+ with(document.selectFirst("div.section#main div.widget header")!!) {
+ thumbnail_url = selectFirst("img")!!.attr("abs:src")
+ genre = select("aside dl:has(dt:contains(Genre)) dd a")
+ .joinToString { it.text() }
+ status = parseStatus(selectFirst("span[data-status]")!!.text())
+ }
+ description = document.select("div.section#main div.widget div.grid #synopsis").text()
+ }
+}
diff --git a/multisrc/overrides/zeistmanga/mikrokosmosfansub/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/zeistmanga/mikrokosmosfansub/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..86a18ccac5
Binary files /dev/null and b/multisrc/overrides/zeistmanga/mikrokosmosfansub/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/zeistmanga/mikrokosmosfansub/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/zeistmanga/mikrokosmosfansub/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..38485b195d
Binary files /dev/null and b/multisrc/overrides/zeistmanga/mikrokosmosfansub/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/zeistmanga/mikrokosmosfansub/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/zeistmanga/mikrokosmosfansub/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..6e271f3a48
Binary files /dev/null and b/multisrc/overrides/zeistmanga/mikrokosmosfansub/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/zeistmanga/mikrokosmosfansub/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/zeistmanga/mikrokosmosfansub/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..465983f1d6
Binary files /dev/null and b/multisrc/overrides/zeistmanga/mikrokosmosfansub/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/zeistmanga/mikrokosmosfansub/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/zeistmanga/mikrokosmosfansub/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..ec52f1f0b2
Binary files /dev/null and b/multisrc/overrides/zeistmanga/mikrokosmosfansub/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/zeistmanga/mikrokosmosfansub/res/web_hi_res_512.png b/multisrc/overrides/zeistmanga/mikrokosmosfansub/res/web_hi_res_512.png
new file mode 100644
index 0000000000..1c1e9c500f
Binary files /dev/null and b/multisrc/overrides/zeistmanga/mikrokosmosfansub/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/zeistmanga/mikrokosmosfansub/src/MikrokosmosFansub.kt b/multisrc/overrides/zeistmanga/mikrokosmosfansub/src/MikrokosmosFansub.kt
new file mode 100644
index 0000000000..ee773195eb
--- /dev/null
+++ b/multisrc/overrides/zeistmanga/mikrokosmosfansub/src/MikrokosmosFansub.kt
@@ -0,0 +1,22 @@
+package eu.kanade.tachiyomi.extension.tr.mikrokosmosfansub
+
+import eu.kanade.tachiyomi.multisrc.zeistmanga.ZeistManga
+import eu.kanade.tachiyomi.source.model.Page
+import eu.kanade.tachiyomi.util.asJsoup
+import okhttp3.Response
+import org.jsoup.Jsoup
+
+class MikrokosmosFansub : ZeistManga("Mikrokosmos Fansub", "https://mikrokosmosfb.blogspot.com", "tr") {
+
+ override val pageListSelector = "div.check-box > script"
+
+ override fun pageListParse(response: Response): List {
+ val document = response.asJsoup()
+ val script = document.select(pageListSelector)
+ val content = script.html().substringAfter("const content = `").substringBefore("`;")
+ val images = Jsoup.parse(content).select("a")
+ return images.select("img[src]").mapIndexed { i, img ->
+ Page(i, "", img.attr("abs:src"))
+ }
+ }
+}
diff --git a/multisrc/overrides/zeistmanga/muslosnosekai/src/MuslosNoSekai.kt b/multisrc/overrides/zeistmanga/muslosnosekai/src/MuslosNoSekai.kt
deleted file mode 100644
index fbee9f9d99..0000000000
--- a/multisrc/overrides/zeistmanga/muslosnosekai/src/MuslosNoSekai.kt
+++ /dev/null
@@ -1,13 +0,0 @@
-package eu.kanade.tachiyomi.extension.es.muslosnosekai
-
-import eu.kanade.tachiyomi.multisrc.zeistmanga.Language
-import eu.kanade.tachiyomi.multisrc.zeistmanga.ZeistManga
-
-class MuslosNoSekai : ZeistManga("Muslos No Sekai", "https://muslosnosekai.blogspot.com", "es") {
-
- override val hasFilters = true
-
- override fun getLanguageList(): List = listOf(
- Language(intl.all, ""),
- )
-}
diff --git a/multisrc/overrides/zeistmanga/noromax/src/Noromax.kt b/multisrc/overrides/zeistmanga/noromax/src/Noromax.kt
deleted file mode 100644
index 3a535ea84e..0000000000
--- a/multisrc/overrides/zeistmanga/noromax/src/Noromax.kt
+++ /dev/null
@@ -1,8 +0,0 @@
-package eu.kanade.tachiyomi.extension.id.noromax
-
-import eu.kanade.tachiyomi.multisrc.zeistmanga.ZeistManga
-
-class Noromax : ZeistManga("Noromax", "https://www.noromax.xyz", "id") {
-
- override val hasFilters = true
-}
diff --git a/multisrc/overrides/zeistmanga/shiyurasub/src/ShiyuraSub.kt b/multisrc/overrides/zeistmanga/shiyurasub/src/ShiyuraSub.kt
index 38870cc9e8..4e310cad44 100644
--- a/multisrc/overrides/zeistmanga/shiyurasub/src/ShiyuraSub.kt
+++ b/multisrc/overrides/zeistmanga/shiyurasub/src/ShiyuraSub.kt
@@ -1,13 +1,32 @@
package eu.kanade.tachiyomi.extension.id.shiyurasub
-import eu.kanade.tachiyomi.multisrc.zeistmanga.Language
import eu.kanade.tachiyomi.multisrc.zeistmanga.ZeistManga
+import eu.kanade.tachiyomi.source.model.MangasPage
+import eu.kanade.tachiyomi.source.model.SManga
+import eu.kanade.tachiyomi.util.asJsoup
+import okhttp3.Request
+import okhttp3.Response
class ShiyuraSub : ZeistManga("ShiyuraSub", "https://shiyurasub.blogspot.com", "id") {
override val hasFilters = true
+ override val hasLanguageFilter = false
- override fun getLanguageList(): List = listOf(
- Language(intl.all, ""),
- )
+ override val supportsLatest = false
+
+ override fun popularMangaRequest(page: Int): Request = latestUpdatesRequest(page)
+ override fun popularMangaParse(response: Response): MangasPage = latestUpdatesParse(response)
+
+ override val pageListSelector = "main.content article.container"
+
+ override fun mangaDetailsParse(response: Response): SManga {
+ val document = response.asJsoup()
+ val profileManga = document.selectFirst("main.content.post")!!
+ return SManga.create().apply {
+ thumbnail_url = profileManga.selectFirst("div.grid img")!!.attr("abs:src")
+ description = profileManga.select("#synopsis").text()
+ genre = profileManga.select("div.my-5 > a[rel=tag]")
+ .joinToString { it.text() }
+ }
+ }
}
diff --git a/multisrc/overrides/zeistmanga/sobatmanku/SobatManKu.kt b/multisrc/overrides/zeistmanga/sobatmanku/SobatManKu.kt
new file mode 100644
index 0000000000..bd08c5c1d0
--- /dev/null
+++ b/multisrc/overrides/zeistmanga/sobatmanku/SobatManKu.kt
@@ -0,0 +1,19 @@
+package eu.kanade.tachiyomi.extension.id.sobatmanku
+
+import eu.kanade.tachiyomi.multisrc.zeistmanga.ZeistManga
+import eu.kanade.tachiyomi.source.model.SChapter
+import okhttp3.Response
+
+class SobatManKu : ZeistManga("SobatManKu", "https://www.sobatmanku19.site", "id") {
+
+ override val hasFilters = true
+
+ override fun chapterListParse(response: Response): List {
+ return super.chapterListParse(response).onEach {
+ // fix some chapter name
+ it.name = it.name.run {
+ substring(indexOf("Chapter"))
+ }
+ }
+ }
+}
diff --git a/multisrc/overrides/zeistmanga/sobatmanku/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/zeistmanga/sobatmanku/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..68a17f51ba
Binary files /dev/null and b/multisrc/overrides/zeistmanga/sobatmanku/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/zeistmanga/sobatmanku/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/zeistmanga/sobatmanku/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..6c936355de
Binary files /dev/null and b/multisrc/overrides/zeistmanga/sobatmanku/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/zeistmanga/sobatmanku/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/zeistmanga/sobatmanku/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..c7699dd2ac
Binary files /dev/null and b/multisrc/overrides/zeistmanga/sobatmanku/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/zeistmanga/sobatmanku/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/zeistmanga/sobatmanku/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..c8faabf661
Binary files /dev/null and b/multisrc/overrides/zeistmanga/sobatmanku/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/zeistmanga/sobatmanku/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/zeistmanga/sobatmanku/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..4b9834a9ca
Binary files /dev/null and b/multisrc/overrides/zeistmanga/sobatmanku/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/zeistmanga/sobatmanku/res/web_hi_res_512.png b/multisrc/overrides/zeistmanga/sobatmanku/res/web_hi_res_512.png
new file mode 100644
index 0000000000..b56a5b3158
Binary files /dev/null and b/multisrc/overrides/zeistmanga/sobatmanku/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/zeistmanga/tooncubus/src/Tooncubus.kt b/multisrc/overrides/zeistmanga/tooncubus/src/Tooncubus.kt
index fa681425b5..660343fd62 100644
--- a/multisrc/overrides/zeistmanga/tooncubus/src/Tooncubus.kt
+++ b/multisrc/overrides/zeistmanga/tooncubus/src/Tooncubus.kt
@@ -3,10 +3,8 @@ package eu.kanade.tachiyomi.extension.id.tooncubus
import eu.kanade.tachiyomi.multisrc.zeistmanga.ZeistManga
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.Response
-import org.jsoup.nodes.Document
class Tooncubus : ZeistManga("Tooncubus", "https://www.tooncubus.top", "id") {
@@ -15,7 +13,7 @@ class Tooncubus : ZeistManga("Tooncubus", "https://www.tooncubus.top", "id") {
override fun chapterListParse(response: Response): List {
return response.asJsoup().selectFirst("ul.series-chapterlist")!!.select("div.flexch-infoz").map { element ->
SChapter.create().apply {
- name = element.select("span")!!.text()
+ name = element.select("span").text()
url = element.select("a").attr("href") // The website uses another domain for reading
}
}
@@ -24,13 +22,4 @@ class Tooncubus : ZeistManga("Tooncubus", "https://www.tooncubus.top", "id") {
override fun pageListRequest(chapter: SChapter) = GET(chapter.url, headers)
override fun getChapterUrl(chapter: SChapter) = chapter.url
-
- override fun mangaDetailsParse(document: Document): SManga {
- val profileManga = document.selectFirst(".grid.gtc-235fr")!!
- return SManga.create().apply {
- thumbnail_url = profileManga.selectFirst("img")!!.attr("src")
- genre = profileManga.select("div.mt-15 > a[rel=tag]")
- .joinToString { it.text() }
- }
- }
}
diff --git a/multisrc/overrides/zeistmanga/tyrantscans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/zeistmanga/tyrantscans/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..0a8138ab72
Binary files /dev/null and b/multisrc/overrides/zeistmanga/tyrantscans/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/zeistmanga/tyrantscans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/zeistmanga/tyrantscans/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..fc3d89063d
Binary files /dev/null and b/multisrc/overrides/zeistmanga/tyrantscans/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/zeistmanga/tyrantscans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/zeistmanga/tyrantscans/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..1218856b03
Binary files /dev/null and b/multisrc/overrides/zeistmanga/tyrantscans/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/zeistmanga/tyrantscans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/zeistmanga/tyrantscans/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..71a80449f6
Binary files /dev/null and b/multisrc/overrides/zeistmanga/tyrantscans/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/zeistmanga/tyrantscans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/zeistmanga/tyrantscans/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..1ced8827cd
Binary files /dev/null and b/multisrc/overrides/zeistmanga/tyrantscans/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/zeistmanga/tyrantscans/res/web_hi_res_512.png b/multisrc/overrides/zeistmanga/tyrantscans/res/web_hi_res_512.png
new file mode 100644
index 0000000000..9fb6f27cd3
Binary files /dev/null and b/multisrc/overrides/zeistmanga/tyrantscans/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/zeistmanga/tyrantscans/src/TyrantScans.kt b/multisrc/overrides/zeistmanga/tyrantscans/src/TyrantScans.kt
new file mode 100644
index 0000000000..20f91998a9
--- /dev/null
+++ b/multisrc/overrides/zeistmanga/tyrantscans/src/TyrantScans.kt
@@ -0,0 +1,15 @@
+package eu.kanade.tachiyomi.extension.pt.tyrantscans
+
+import eu.kanade.tachiyomi.multisrc.zeistmanga.ZeistManga
+import eu.kanade.tachiyomi.source.model.MangasPage
+import okhttp3.Request
+import okhttp3.Response
+
+class TyrantScans : ZeistManga("Tyrant Scans", "https://www.tyrantscans.com", "pt-BR") {
+
+ override val supportsLatest = false
+
+ override fun popularMangaRequest(page: Int): Request = latestUpdatesRequest(page)
+
+ override fun popularMangaParse(response: Response): MangasPage = latestUpdatesParse(response)
+}
diff --git a/multisrc/overrides/zeistmanga/yokai/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/zeistmanga/yokai/res/mipmap-hdpi/ic_launcher.png
new file mode 100644
index 0000000000..f85f4182c5
Binary files /dev/null and b/multisrc/overrides/zeistmanga/yokai/res/mipmap-hdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/zeistmanga/yokai/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/zeistmanga/yokai/res/mipmap-mdpi/ic_launcher.png
new file mode 100644
index 0000000000..aad38c9745
Binary files /dev/null and b/multisrc/overrides/zeistmanga/yokai/res/mipmap-mdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/zeistmanga/yokai/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/zeistmanga/yokai/res/mipmap-xhdpi/ic_launcher.png
new file mode 100644
index 0000000000..ec169d5e6b
Binary files /dev/null and b/multisrc/overrides/zeistmanga/yokai/res/mipmap-xhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/zeistmanga/yokai/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/zeistmanga/yokai/res/mipmap-xxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..7c49f55f5c
Binary files /dev/null and b/multisrc/overrides/zeistmanga/yokai/res/mipmap-xxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/zeistmanga/yokai/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/zeistmanga/yokai/res/mipmap-xxxhdpi/ic_launcher.png
new file mode 100644
index 0000000000..ed18be3646
Binary files /dev/null and b/multisrc/overrides/zeistmanga/yokai/res/mipmap-xxxhdpi/ic_launcher.png differ
diff --git a/multisrc/overrides/zeistmanga/yokai/res/web_hi_res_512.png b/multisrc/overrides/zeistmanga/yokai/res/web_hi_res_512.png
new file mode 100644
index 0000000000..0214dbe9b5
Binary files /dev/null and b/multisrc/overrides/zeistmanga/yokai/res/web_hi_res_512.png differ
diff --git a/multisrc/overrides/zmanga/alceascan/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/zmanga/alceascan/res/mipmap-hdpi/ic_launcher.png
deleted file mode 100644
index 215d6ed6ba..0000000000
Binary files a/multisrc/overrides/zmanga/alceascan/res/mipmap-hdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/zmanga/alceascan/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/zmanga/alceascan/res/mipmap-mdpi/ic_launcher.png
deleted file mode 100644
index 15a3c9940a..0000000000
Binary files a/multisrc/overrides/zmanga/alceascan/res/mipmap-mdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/zmanga/alceascan/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/zmanga/alceascan/res/mipmap-xhdpi/ic_launcher.png
deleted file mode 100644
index db8b32de46..0000000000
Binary files a/multisrc/overrides/zmanga/alceascan/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/zmanga/alceascan/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/zmanga/alceascan/res/mipmap-xxhdpi/ic_launcher.png
deleted file mode 100644
index 81aabc0ab6..0000000000
Binary files a/multisrc/overrides/zmanga/alceascan/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/zmanga/alceascan/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/zmanga/alceascan/res/mipmap-xxxhdpi/ic_launcher.png
deleted file mode 100644
index 9c5c3babf7..0000000000
Binary files a/multisrc/overrides/zmanga/alceascan/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ
diff --git a/multisrc/overrides/zmanga/alceascan/res/web_hi_res_512.png b/multisrc/overrides/zmanga/alceascan/res/web_hi_res_512.png
deleted file mode 100644
index 9452401808..0000000000
Binary files a/multisrc/overrides/zmanga/alceascan/res/web_hi_res_512.png and /dev/null differ
diff --git a/multisrc/src/main/AndroidManifest.xml b/multisrc/src/main/AndroidManifest.xml
deleted file mode 100644
index 17ee0c14a4..0000000000
--- a/multisrc/src/main/AndroidManifest.xml
+++ /dev/null
@@ -1 +0,0 @@
-
diff --git a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/a3manga/A3Manga.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/a3manga/A3Manga.kt
index a5da4d2511..daf21dd051 100644
--- a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/a3manga/A3Manga.kt
+++ b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/a3manga/A3Manga.kt
@@ -147,7 +147,7 @@ open class A3Manga(
}.getOrNull() ?: 0
}
- override fun pageListParse(document: Document): List {
+ protected fun decodeImgList(document: Document): String {
val htmlContentScript = document.selectFirst("script:containsData(htmlContent)")?.html()
?.substringAfter("var htmlContent=\"")
?.substringBefore("\";")
@@ -175,8 +175,41 @@ open class A3Manga(
val imgListHtml = cipher.doFinal(ciphertext).toString(Charsets.UTF_8)
- return Jsoup.parseBodyFragment(imgListHtml).select("img").mapIndexed { idx, it ->
- Page(idx, imageUrl = it.attr("abs:src"))
+ return imgListHtml
+ }
+
+ override fun pageListParse(document: Document): List {
+ val imgListHtml = decodeImgList(document)
+
+ return Jsoup.parseBodyFragment(imgListHtml).select("img").mapIndexed { idx, element ->
+ val encryptedUrl = element.attributes().find { it.key.startsWith("data") }?.value
+ val effectiveUrl = encryptedUrl?.decodeUrl() ?: element.attr("abs:src")
+ Page(idx, imageUrl = effectiveUrl)
+ }
+ }
+
+ private fun String.decodeUrl(): String? {
+ // We expect the URL to start with `https://`, where the last 3 characters are encoded.
+ // The length of the encoded character is not known, but it is the same across all.
+ // Essentially we are looking for the two encoded slashes, which tells us the length.
+ val patternIdx = patternsLengthCheck.indexOfFirst { pattern ->
+ val matchResult = pattern.find(this)
+ val g1 = matchResult?.groupValues?.get(1)
+ val g2 = matchResult?.groupValues?.get(2)
+ g1 == g2 && g1 != null
+ }
+ if (patternIdx == -1) {
+ return null
+ }
+
+ // With a known length we can predict all the encoded characters.
+ // This is a slightly more expensive pattern, hence the separation.
+ val matchResult = patternsSubstitution[patternIdx].find(this)
+ return matchResult?.destructured?.let { (colon, slash, period) ->
+ this
+ .replace(colon, ":")
+ .replace(slash, "/")
+ .replace(period, ".")
}
}
@@ -203,5 +236,12 @@ open class A3Manga(
val dateFormat = SimpleDateFormat("dd/MM/yyyy", Locale.US).apply {
timeZone = TimeZone.getTimeZone("Asia/Ho_Chi_Minh")
}
+
+ private val patternsLengthCheck: List = (20 downTo 1).map { i ->
+ """^https.{$i}(.{$i})(.{$i})""".toRegex()
+ }
+ private val patternsSubstitution: List = (20 downTo 1).map { i ->
+ """^https(.{$i})(.{$i}).*(.{$i})(?:webp|jpeg|tiff|.{3})$""".toRegex()
+ }
}
}
diff --git a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/a3manga/A3MangaGenerator.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/a3manga/A3MangaGenerator.kt
index 9a0500766d..5e7ac5ed44 100644
--- a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/a3manga/A3MangaGenerator.kt
+++ b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/a3manga/A3MangaGenerator.kt
@@ -9,13 +9,13 @@ class A3MangaGenerator : ThemeSourceGenerator {
override val themeClass = "A3Manga"
- override val baseVersionCode: Int = 1
+ override val baseVersionCode: Int = 2
override val sources = listOf(
- SingleLang("A3 Manga", "https://www.a3mnga.com", "vi"),
- SingleLang("Team Lanh Lung", "https://teamlanhlung.com", "vi", sourceName = "Team Lạnh Lùng"),
+ SingleLang("A3 Manga", "https://www.a3manga.info", "vi"),
+ SingleLang("Team Lanh Lung", "https://teamlanhlung.me", "vi", sourceName = "Team Lạnh Lùng", overrideVersionCode = 1),
SingleLang("Ngon Phong", "https://www.ngonphong.com", "vi", sourceName = "Ngôn Phong", overrideVersionCode = 1),
- SingleLang("O Cu Meo", "https://www.ocumeo.com", "vi", sourceName = "Ổ Cú Mèo"),
+ SingleLang("O Cu Meo", "https://www.ocumoe.com", "vi", sourceName = "Ổ Cú Mèo", overrideVersionCode = 1),
)
companion object {
diff --git a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/bakamanga/BakaMangaGenerator.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/bakamanga/BakaMangaGenerator.kt
index ff5325d52b..b271dd90e3 100644
--- a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/bakamanga/BakaMangaGenerator.kt
+++ b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/bakamanga/BakaMangaGenerator.kt
@@ -11,9 +11,6 @@ class BakaMangaGenerator : ThemeSourceGenerator {
override val baseVersionCode = 1
override val sources = listOf(
- SingleLang("ManhuaManga.net", "https://manhuamanga.net", "en", className = "ManhuaMangaNet", overrideVersionCode = 2),
- SingleLang("ManhwaManga.net", "https://manhwamanga.net", "en", isNsfw = true, className = "ManhwaMangaNet", overrideVersionCode = 7),
- SingleLang("MWManhwa", "https://mwmanhwa.net", "all", isNsfw = true),
SingleLang("Manhwa XXL", "https://manhwaxxl.com", "en", isNsfw = true),
)
diff --git a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/bilibili/Bilibili.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/bilibili/Bilibili.kt
index a072d55c4b..ccf803d6ed 100644
--- a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/bilibili/Bilibili.kt
+++ b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/bilibili/Bilibili.kt
@@ -204,7 +204,7 @@ abstract class Bilibili(
title = comic.title
author = comic.authorName.joinToString()
- genre = comic.genres(intl.pricePaid, EMOJI_LOCKED).joinToString()
+ genre = comic.styles.joinToString()
status = when {
comic.isFinish == 1 -> SManga.COMPLETED
comic.isOnHiatus -> SManga.ON_HIATUS
@@ -215,11 +215,10 @@ abstract class Bilibili(
append("${intl.hasPaidChaptersWarning(comic.paidChaptersCount)}\n\n")
}
- append("${comic.classicLines}\n\n")
- append("${intl.informationTitle}:")
- append("\n• ${intl.totalChapterCount}: ${intl.localize(comic.episodeList.size)}")
+ append(comic.classicLines)
if (comic.updateWeekdays.isNotEmpty() && status == SManga.ONGOING) {
+ append("\n\n${intl.informationTitle}:")
append("\n• ${intl.getUpdateDays(comic.updateWeekdays)}")
}
}
@@ -237,13 +236,21 @@ abstract class Bilibili(
return emptyList()
}
- return result.data!!.episodeList
- .filter { episode -> episode.payMode == 0 && episode.payGold == 0 }
- .map { ep -> chapterFromObject(ep, result.data.id) }
+ return result.data!!.episodeList.map { ep -> chapterFromObject(ep, result.data.id) }
}
- protected open fun chapterFromObject(episode: BilibiliEpisodeDto, comicId: Int): SChapter = SChapter.create().apply {
- name = episode.shortTitle.plus(if (episode.title.isNotBlank()) " - ${episode.title}" else "")
+ protected open fun chapterFromObject(episode: BilibiliEpisodeDto, comicId: Int, isUnlocked: Boolean = false): SChapter = SChapter.create().apply {
+ name = buildString {
+ if (episode.isPaid && !isUnlocked) {
+ append("$EMOJI_LOCKED ")
+ }
+
+ append(episode.shortTitle)
+
+ if (episode.title.isNotBlank()) {
+ append(" - ${episode.title}")
+ }
+ }
date_upload = episode.publicationTime.toDate()
url = "/mc$comicId/${episode.id}"
}
diff --git a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/bilibili/BilibiliDto.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/bilibili/BilibiliDto.kt
index 3d5e2c70ce..a9db40cb28 100644
--- a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/bilibili/BilibiliDto.kt
+++ b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/bilibili/BilibiliDto.kt
@@ -34,10 +34,7 @@ data class BilibiliComicDto(
get() = paidChaptersCount > 0
val paidChaptersCount: Int
- get() = episodeList.filter { episode -> episode.payMode == 1 && episode.payGold > 0 }.size
-
- fun genres(paidLabel: String, emoji: String): List =
- (if (hasPaidChapters) listOf("$emoji $paidLabel") else emptyList()) + styles
+ get() = episodeList.filter { it.isPaid }.size
}
@Serializable
@@ -50,7 +47,9 @@ data class BilibiliEpisodeDto(
@SerialName("pub_time") val publicationTime: String,
@SerialName("short_title") val shortTitle: String,
val title: String,
-)
+) {
+ val isPaid = payMode == 1 && payGold > 0
+}
@Serializable
data class BilibiliReader(
diff --git a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/bilibili/BilibiliGenerator.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/bilibili/BilibiliGenerator.kt
index 45f91190cb..7fd830e6e0 100644
--- a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/bilibili/BilibiliGenerator.kt
+++ b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/bilibili/BilibiliGenerator.kt
@@ -10,7 +10,7 @@ class BilibiliGenerator : ThemeSourceGenerator {
override val themeClass = "Bilibili"
- override val baseVersionCode: Int = 8
+ override val baseVersionCode: Int = 9
override val sources = listOf(
MultiLang(
diff --git a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/bilibili/BilibiliIntl.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/bilibili/BilibiliIntl.kt
index 375c51aa27..b656f56bff 100644
--- a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/bilibili/BilibiliIntl.kt
+++ b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/bilibili/BilibiliIntl.kt
@@ -54,9 +54,8 @@ class BilibiliIntl(private val lang: String) {
"actualice la lista de capítulos para leerlos."
else ->
"${Bilibili.EMOJI_WARNING} WARNING: This series has ${chapterCount.localized} paid " +
- "chapters that were filtered out from the chapter list. If you have already " +
- "unlocked and have any in your account, sign in through WebView and refresh " +
- "the chapter list to read them."
+ "chapters. If you have any unlocked in your account then sign in through WebView " +
+ "to be able to read them."
}
val imageQualityPrefTitle: String = when (lang) {
@@ -85,6 +84,7 @@ class BilibiliIntl(private val lang: String) {
else -> "Interest"
}
+ @Suppress("UNUSED") // In BilibiliManga
val sortPopular: String = when (lang) {
CHINESE, SIMPLIFIED_CHINESE -> "人气推荐"
INDONESIAN -> "Populer"
@@ -101,11 +101,13 @@ class BilibiliIntl(private val lang: String) {
else -> "Updated"
}
+ @Suppress("UNUSED") // In BilibiliManga
val sortAdded: String = when (lang) {
CHINESE, SIMPLIFIED_CHINESE -> "上架时间"
else -> "Added"
}
+ @Suppress("UNUSED") // In BilibiliManga
val sortFollowers: String = when (lang) {
CHINESE, SIMPLIFIED_CHINESE -> "追漫人数"
else -> "Followers count"
@@ -135,6 +137,7 @@ class BilibiliIntl(private val lang: String) {
else -> "Completed"
}
+ @Suppress("UNUSED") // In BilibiliManga
val priceAll: String = when (lang) {
CHINESE, SIMPLIFIED_CHINESE -> "全部"
INDONESIAN -> "Semua"
@@ -142,6 +145,7 @@ class BilibiliIntl(private val lang: String) {
else -> "All"
}
+ @Suppress("UNUSED") // In BilibiliManga
val priceFree: String = when (lang) {
CHINESE, SIMPLIFIED_CHINESE -> "免费"
INDONESIAN -> "Bebas"
@@ -149,6 +153,7 @@ class BilibiliIntl(private val lang: String) {
else -> "Free"
}
+ @Suppress("UNUSED") // In BilibiliManga
val pricePaid: String = when (lang) {
CHINESE, SIMPLIFIED_CHINESE -> "付费"
INDONESIAN -> "Dibayar"
@@ -156,17 +161,20 @@ class BilibiliIntl(private val lang: String) {
else -> "Paid"
}
+ @Suppress("UNUSED") // In BilibiliManga
val priceWaitForFree: String = when (lang) {
CHINESE, SIMPLIFIED_CHINESE -> "等就免费"
else -> "Wait for free"
}
+ @Suppress("UNUSED") // In BilibiliComics
val failedToRefreshToken: String = when (lang) {
CHINESE, SIMPLIFIED_CHINESE -> "无法刷新令牌。请打开 WebView 修正错误。"
SPANISH -> "Error al actualizar el token. Abra el WebView para solucionar este error."
else -> "Failed to refresh the token. Open the WebView to fix this error."
}
+ @Suppress("UNUSED") // In BilibiliComics
val failedToGetCredential: String = when (lang) {
CHINESE, SIMPLIFIED_CHINESE -> "无法获取阅读章节所需的凭证。"
SPANISH -> "Erro al obtener la credencial para leer el capítulo."
@@ -179,12 +187,6 @@ class BilibiliIntl(private val lang: String) {
else -> "Information"
}
- val totalChapterCount: String = when (lang) {
- CHINESE, SIMPLIFIED_CHINESE -> "章节总数"
- SPANISH -> "Número total de capítulos"
- else -> "Total chapter count"
- }
-
private val updatesDaily: String = when (lang) {
CHINESE, SIMPLIFIED_CHINESE -> "每日更新"
SPANISH -> "Actualizaciones diarias"
@@ -208,17 +210,17 @@ class BilibiliIntl(private val lang: String) {
return updatesEvery(days)
}
- fun localize(value: Int) = value.localized
-
private val Int.localized: String
get() = numberFormat.format(this)
companion object {
const val CHINESE = "zh"
- const val ENGLISH = "en"
const val INDONESIAN = "id"
const val SIMPLIFIED_CHINESE = "zh-Hans"
const val SPANISH = "es"
const val FRENCH = "fr"
+
+ @Suppress("UNUSED") // In BilibiliComics
+ const val ENGLISH = "en"
}
}
diff --git a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/comicake/ComiCake.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/comicake/ComiCake.kt
deleted file mode 100644
index 316f420e06..0000000000
--- a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/comicake/ComiCake.kt
+++ /dev/null
@@ -1,187 +0,0 @@
-package eu.kanade.tachiyomi.multisrc.comicake
-
-import android.os.Build
-import eu.kanade.tachiyomi.AppInfo
-import eu.kanade.tachiyomi.network.GET
-import eu.kanade.tachiyomi.network.asObservableSuccess
-import eu.kanade.tachiyomi.source.model.FilterList
-import eu.kanade.tachiyomi.source.model.MangasPage
-import eu.kanade.tachiyomi.source.model.Page
-import eu.kanade.tachiyomi.source.model.SChapter
-import eu.kanade.tachiyomi.source.model.SManga
-import eu.kanade.tachiyomi.source.online.HttpSource
-import okhttp3.Headers
-import okhttp3.Request
-import okhttp3.Response
-import org.json.JSONArray
-import org.json.JSONObject
-import rx.Observable
-import java.text.SimpleDateFormat
-import java.util.Locale
-
-abstract class ComiCake(
- override val name: String,
- final override val baseUrl: String,
- override val lang: String,
- readerEndpoint: String = COMICAKE_DEFAULT_READER_ENDPOINT,
- apiEndpoint: String = COMICAKE_DEFAULT_API_ENDPOINT,
-) : HttpSource() {
-
- override val versionId = 1
- override val supportsLatest = true
- private val readerBase = baseUrl + readerEndpoint
- private var apiBase = baseUrl + apiEndpoint
-
- private val userAgent = "Mozilla/5.0 (" +
- "Android ${Build.VERSION.RELEASE}; Mobile) " +
- "Tachiyomi/${AppInfo.getVersionName()}"
-
- override fun headersBuilder() = Headers.Builder().apply {
- add("User-Agent", userAgent)
- }
-
- override fun popularMangaRequest(page: Int): Request {
- return GET("$apiBase/comics.json?ordering=-created_at&page=$page") // Not actually popular, just latest added to system
- }
-
- override fun popularMangaParse(response: Response): MangasPage {
- val res = response.body.string()
- return getMangasPageFromComicsResponse(res)
- }
-
- private fun getMangasPageFromComicsResponse(json: String, nested: Boolean = false): MangasPage {
- val response = JSONObject(json)
- val results = response.getJSONArray("results")
- val mangas = ArrayList()
- val ids = mutableListOf()
-
- for (i in 0 until results.length()) {
- val obj = results.getJSONObject(i)
- if (nested) {
- val nestedComic = obj.getJSONObject("comic")
- val id = nestedComic.getInt("id")
- if (ids.contains(id)) {
- continue
- }
- ids.add(id)
- val manga = SManga.create()
- manga.url = id.toString()
- manga.title = nestedComic.getString("name")
- mangas.add(manga)
- } else {
- val id = obj.getInt("id")
- if (ids.contains(id)) {
- continue
- }
- ids.add(id)
- mangas.add(parseComicJson(obj))
- }
- }
-
- return MangasPage(mangas, !(response.getString("next").isNullOrEmpty() || response.getString("next") == "null"))
- }
-
- // Shenanigans to allow "open in webview" to show a webpage instead of JSON
- override fun fetchMangaDetails(manga: SManga): Observable {
- return client.newCall(apiMangaDetailsRequest(manga))
- .asObservableSuccess()
- .map { response ->
- mangaDetailsParse(response).apply { initialized = true }
- }
- }
-
- private fun apiMangaDetailsRequest(manga: SManga): Request {
- return GET("$apiBase/comics/${manga.url}.json")
- }
-
- override fun mangaDetailsRequest(manga: SManga): Request {
- return GET(manga.description!!.substringAfterLast("\n"))
- }
-
- override fun mangaDetailsParse(response: Response): SManga {
- val comicJson = JSONObject(response.body.string())
- return parseComicJson(comicJson, true)
- }
-
- private fun parseComicJson(obj: JSONObject, human: Boolean = false) = SManga.create().apply {
- url = if (human) {
- "$readerBase/series/${obj.getString("slug")}/"
- } else {
- obj.getInt("id").toString() // Yeah, I know... Feel free to improve on this
- }
- title = obj.getString("name")
- thumbnail_url = obj.getString("cover")
- author = parseListNames(obj.getJSONArray("author"))
- artist = parseListNames(obj.getJSONArray("artist"))
- description = obj.getString("description") +
- "\n\n${readerBase}series/${obj.getString("slug")}/" // webpage for "open in webview"
- genre = parseListNames(obj.getJSONArray("tags"))
- status = SManga.UNKNOWN
- }
-
- private fun parseListNames(arr: JSONArray): String {
- val hold = ArrayList(arr.length())
- for (i in 0 until arr.length())
- hold.add(arr.getJSONObject(i).getString("name"))
- return hold.sorted().joinToString(", ")
- }
-
- override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
- // TODO filters
- return GET("$apiBase/comics.json?page=$page&search=$query")
- }
-
- override fun searchMangaParse(response: Response): MangasPage {
- val res = response.body.string()
- return getMangasPageFromComicsResponse(res)
- }
-
- override fun latestUpdatesRequest(page: Int): Request {
- return GET("$apiBase/chapters.json?page=$page&expand=comic")
- }
-
- override fun latestUpdatesParse(response: Response): MangasPage {
- val res = response.body.string()
- return getMangasPageFromComicsResponse(res, true)
- }
-
- private fun parseChapterJson(obj: JSONObject) = SChapter.create().apply {
- name = obj.getString("title") // title will always have content, vs. name that's an optional field
- chapter_number = (obj.getInt("chapter") + (obj.getInt("subchapter") / 10.0)).toFloat()
- date_upload = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ssZZZ", Locale.getDefault()).parse(obj.getString("published_at"))?.time ?: 0L
- // TODO scanlator field by adding team to expandable in CC (low priority given the use case of CC)
- url = obj.getString("manifest")
- }
-
- override fun chapterListRequest(manga: SManga): Request {
- return GET("$apiBase/chapters.json?comic=${manga.url}&ordering=-volume%2C-chapter%2C-subchapter&n=1000", headers) // There's no pagination in Tachiyomi for chapters so we get 1k chapters
- }
-
- override fun chapterListParse(response: Response): List {
- val chapterJson = JSONObject(response.body.string())
- val results = chapterJson.getJSONArray("results")
- val ret = ArrayList()
- for (i in 0 until results.length()) {
- ret.add(parseChapterJson(results.getJSONObject(i)))
- }
- return ret
- }
-
- override fun pageListParse(response: Response): List {
- val webPub = JSONObject(response.body.string())
- val readingOrder = webPub.getJSONArray("readingOrder")
- val ret = ArrayList()
- for (i in 0 until readingOrder.length()) {
- val pageUrl = readingOrder.getJSONObject(i).getString("href")
- ret.add(Page(i, "", pageUrl))
- }
- return ret
- }
-
- override fun imageUrlParse(response: Response) = throw UnsupportedOperationException("This method should not be called!")
-
- companion object {
- private const val COMICAKE_DEFAULT_API_ENDPOINT = "/api" // Highly unlikely to change
- private const val COMICAKE_DEFAULT_READER_ENDPOINT = "/r/" // Can change based on CC config
- }
-}
diff --git a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/comicake/ComiCakeGenerator.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/comicake/ComiCakeGenerator.kt
deleted file mode 100644
index c1abc51482..0000000000
--- a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/comicake/ComiCakeGenerator.kt
+++ /dev/null
@@ -1,24 +0,0 @@
-package eu.kanade.tachiyomi.multisrc.comicake
-
-import generator.ThemeSourceData.SingleLang
-import generator.ThemeSourceGenerator
-
-class ComiCakeGenerator : ThemeSourceGenerator {
-
- override val themePkg = "comicake"
-
- override val themeClass = "ComiCake"
-
- override val baseVersionCode: Int = 1
-
- override val sources = listOf(
- SingleLang("WhimSubs", "https://whimsubs.xyz", "en"),
- )
-
- companion object {
- @JvmStatic
- fun main(args: Array) {
- ComiCakeGenerator().createAll()
- }
- }
-}
diff --git a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/fansubscat/FansubsCat.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/fansubscat/FansubsCat.kt
new file mode 100644
index 0000000000..bae45d35dd
--- /dev/null
+++ b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/fansubscat/FansubsCat.kt
@@ -0,0 +1,403 @@
+package eu.kanade.tachiyomi.multisrc.fansubscat
+
+import eu.kanade.tachiyomi.AppInfo
+import eu.kanade.tachiyomi.network.GET
+import eu.kanade.tachiyomi.source.model.Filter
+import eu.kanade.tachiyomi.source.model.FilterList
+import eu.kanade.tachiyomi.source.model.MangasPage
+import eu.kanade.tachiyomi.source.model.Page
+import eu.kanade.tachiyomi.source.model.SChapter
+import eu.kanade.tachiyomi.source.model.SManga
+import eu.kanade.tachiyomi.source.online.HttpSource
+import kotlinx.serialization.decodeFromString
+import kotlinx.serialization.json.Json
+import kotlinx.serialization.json.JsonObject
+import kotlinx.serialization.json.contentOrNull
+import kotlinx.serialization.json.float
+import kotlinx.serialization.json.jsonArray
+import kotlinx.serialization.json.jsonObject
+import kotlinx.serialization.json.jsonPrimitive
+import kotlinx.serialization.json.long
+import okhttp3.Headers
+import okhttp3.HttpUrl
+import okhttp3.HttpUrl.Companion.toHttpUrl
+import okhttp3.OkHttpClient
+import okhttp3.Request
+import okhttp3.Response
+import uy.kohesive.injekt.injectLazy
+
+abstract class FansubsCat(
+ override val name: String,
+ override val baseUrl: String,
+ override val lang: String,
+ val isHentaiSite: Boolean,
+) : HttpSource() {
+
+ private val apiBaseUrl = "https://api.fansubs.cat"
+
+ override val supportsLatest = true
+
+ override fun headersBuilder(): Headers.Builder = Headers.Builder()
+ .add("User-Agent", "Tachiyomi/${AppInfo.getVersionName()}")
+
+ override val client: OkHttpClient = network.client
+
+ private val json: Json by injectLazy()
+
+ private fun parseMangaFromJson(response: Response): MangasPage {
+ val jsonObject = json.decodeFromString(response.body.string())
+
+ val mangas = jsonObject["result"]!!.jsonArray.map { json ->
+ SManga.create().apply {
+ url = json.jsonObject["slug"]!!.jsonPrimitive.content
+ title = json.jsonObject["name"]!!.jsonPrimitive.content
+ thumbnail_url = json.jsonObject["thumbnail_url"]!!.jsonPrimitive.content
+ author = json.jsonObject["author"]!!.jsonPrimitive.contentOrNull
+ description = json.jsonObject["synopsis"]!!.jsonPrimitive.contentOrNull
+ status = json.jsonObject["status"]!!.jsonPrimitive.content.toStatus()
+ genre = json.jsonObject["genres"]!!.jsonPrimitive.contentOrNull
+ }
+ }
+
+ return MangasPage(mangas, mangas.size >= 20)
+ }
+
+ private fun parseChapterListFromJson(response: Response): List {
+ val jsonObject = json.decodeFromString(response.body.string())
+
+ return jsonObject["result"]!!.jsonArray.map { json ->
+ SChapter.create().apply {
+ url = json.jsonObject["id"]!!.jsonPrimitive.content
+ name = json.jsonObject["title"]!!.jsonPrimitive.content
+ chapter_number = json.jsonObject["number"]!!.jsonPrimitive.float
+ scanlator = json.jsonObject["fansub"]!!.jsonPrimitive.content
+ date_upload = json.jsonObject["created"]!!.jsonPrimitive.long
+ }
+ }
+ }
+
+ private fun parsePageListFromJson(response: Response): List {
+ val jsonObject = json.decodeFromString(response.body.string())
+
+ return jsonObject["result"]!!.jsonArray.mapIndexed { i, it ->
+ Page(
+ i,
+ it.jsonObject["url"]!!.jsonPrimitive.content,
+ it.jsonObject["url"]!!.jsonPrimitive.content,
+ )
+ }
+ }
+
+ // Popular
+
+ override fun popularMangaRequest(page: Int): Request {
+ return GET("$apiBaseUrl/manga/popular/$page?hentai=$isHentaiSite", headers)
+ }
+
+ override fun popularMangaParse(response: Response): MangasPage = parseMangaFromJson(response)
+
+ // Latest
+
+ override fun latestUpdatesRequest(page: Int): Request {
+ return GET("$apiBaseUrl/manga/recent/$page?hentai=$isHentaiSite", headers)
+ }
+
+ override fun latestUpdatesParse(response: Response): MangasPage = parseMangaFromJson(response)
+
+ // Search
+
+ override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
+ val filterList = if (filters.isEmpty()) getFilterList() else filters
+ val mangaTypeFilter = filterList.find { it is MangaTypeFilter } as MangaTypeFilter
+ val stateFilter = filterList.find { it is StateFilter } as StateFilter
+ val demographyFilter = filterList.find { it is DemographyFilter } as DemographyFilter
+ val genreFilter = filterList.find { it is GenreTagFilter } as GenreTagFilter
+ val themeFilter = filterList.find { it is ThemeTagFilter } as ThemeTagFilter
+ val builder = "$apiBaseUrl/manga/search/$page?hentai=$isHentaiSite".toHttpUrl().newBuilder()
+ mangaTypeFilter.addQueryParameter(builder)
+ stateFilter.addQueryParameter(builder)
+ demographyFilter.addQueryParameter(builder)
+ genreFilter.addQueryParameter(builder)
+ themeFilter.addQueryParameter(builder)
+ if (query.isNotBlank()) {
+ builder.addQueryParameter("query", query)
+ }
+ return GET(builder.toString(), headers)
+ }
+
+ override fun searchMangaParse(response: Response): MangasPage = parseMangaFromJson(response)
+
+ // Details
+
+ override fun mangaDetailsRequest(manga: SManga): Request {
+ return GET(
+ "$apiBaseUrl/manga/details/${manga.url.substringAfterLast('/')}?hentai=$isHentaiSite",
+ headers,
+ )
+ }
+
+ override fun getMangaUrl(manga: SManga): String {
+ return "$baseUrl/${manga.url}"
+ }
+
+ override fun mangaDetailsParse(response: Response): SManga {
+ val jsonObject = json.decodeFromString(response.body.string())
+ val resultObject = jsonObject.jsonObject["result"]!!.jsonObject
+
+ return SManga.create().apply {
+ url = resultObject["slug"]!!.jsonPrimitive.content
+ title = resultObject["name"]!!.jsonPrimitive.content
+ thumbnail_url = resultObject["thumbnail_url"]!!.jsonPrimitive.content
+ author = resultObject["author"]!!.jsonPrimitive.contentOrNull
+ description = resultObject["synopsis"]!!.jsonPrimitive.contentOrNull
+ status = resultObject["status"]!!.jsonPrimitive.content.toStatus()
+ genre = resultObject["genres"]!!.jsonPrimitive.contentOrNull
+ }
+ }
+
+ private fun String?.toStatus() = when {
+ this == null -> SManga.UNKNOWN
+ this.contains("ongoing", ignoreCase = true) -> SManga.ONGOING
+ this.contains("finished", ignoreCase = true) -> SManga.COMPLETED
+ else -> SManga.UNKNOWN
+ }
+
+ // Chapters
+
+ override fun chapterListRequest(manga: SManga): Request {
+ return GET(
+ "$apiBaseUrl/manga/chapters/${manga.url.substringAfterLast('/')}?hentai=$isHentaiSite",
+ headers,
+ )
+ }
+
+ override fun chapterListParse(response: Response): List =
+ parseChapterListFromJson(response)
+
+ // Pages
+
+ override fun pageListRequest(chapter: SChapter): Request {
+ return GET(
+ "$apiBaseUrl/manga/pages/${chapter.url.substringAfterLast('/')}?hentai=$isHentaiSite",
+ headers,
+ )
+ }
+
+ override fun getChapterUrl(chapter: SChapter): String {
+ return "$baseUrl/${chapter.url.replace("/", "?f=")}"
+ }
+
+ override fun pageListParse(response: Response): List = parsePageListFromJson(response)
+
+ override fun imageUrlParse(response: Response): String =
+ throw UnsupportedOperationException("Not used")
+
+ // Filter
+ override fun getFilterList() = FilterList(
+ listOfNotNull(
+ MangaTypeFilter("Tipus", getMangaTypeList()),
+ StateFilter("Estat", getStateList()),
+ if (!isHentaiSite) {
+ DemographyFilter("Demografies", getDemographyList())
+ } else {
+ null
+ },
+ GenreTagFilter("Gèneres (inclou/exclou)", getGenreList()),
+ ThemeTagFilter("Temàtiques (inclou/exclou)", getThemeList()),
+ ),
+ )
+
+ private fun getMangaTypeList() = listOf(
+ MangaType("oneshot", "One-shots"),
+ MangaType("serialized", "Serialitzats"),
+ )
+
+ private fun getStateList() = listOf(
+ State(1, "Completat"),
+ State(2, "En procés"),
+ State(3, "Parcialment completat"),
+ State(4, "Abandonat"),
+ State(5, "Cancel·lat"),
+ )
+
+ private fun getDemographyList() = listOf(
+ Demography(35, "Infantil"),
+ Demography(27, "Josei"),
+ Demography(12, "Seinen"),
+ Demography(16, "Shōjo"),
+ Demography(1, "Shōnen"),
+ Demography(-1, "No definida"),
+ )
+
+ private fun getGenreList() = listOfNotNull(
+ Tag(4, "Acció"),
+ Tag(7, "Amor"),
+ Tag(38, "Amor entre noies"),
+ Tag(23, "Amor entre nois"),
+ Tag(31, "Avantguardisme"),
+ Tag(6, "Aventura"),
+ Tag(10, "Ciència-ficció"),
+ Tag(2, "Comèdia"),
+ Tag(47, "De prestigi"),
+ Tag(3, "Drama"),
+ Tag(19, "Ecchi"),
+ Tag(46, "Erotisme"),
+ Tag(20, "Esports"),
+ Tag(5, "Fantasia"),
+ Tag(48, "Gastronomia"),
+ if (isHentaiSite) {
+ Tag(34, "Hentai")
+ } else {
+ null
+ },
+ Tag(11, "Misteri"),
+ Tag(8, "Sobrenatural"),
+ Tag(17, "Suspens"),
+ Tag(21, "Terror"),
+ Tag(42, "Vida quotidiana"),
+ )
+
+ private fun getThemeList() = listOf(
+ Tag(71, "Animals de companyia"),
+ Tag(50, "Antropomorfisme"),
+ Tag(70, "Arts escèniques"),
+ Tag(18, "Arts marcials"),
+ Tag(81, "Arts visuals"),
+ Tag(64, "Canvi de gènere màgic"),
+ Tag(56, "Comèdia de gags"),
+ Tag(68, "Crim organitzat"),
+ Tag(69, "Cultura otaku"),
+ Tag(30, "Curses"),
+ Tag(54, "Delinqüència"),
+ Tag(43, "Detectivesc"),
+ Tag(55, "Educatiu"),
+ Tag(9, "Escolar"),
+ Tag(39, "Espai"),
+ Tag(77, "Esports d’equip"),
+ Tag(53, "Esports de combat"),
+ Tag(25, "Harem"),
+ Tag(73, "Harem invers"),
+ Tag(15, "Històric"),
+ Tag(59, "Idols femenines"),
+ Tag(60, "Idols masculins"),
+ Tag(75, "Indústria de l’entreteniment"),
+ Tag(61, "Isekai"),
+ Tag(58, "Joc d’alt risc"),
+ Tag(33, "Joc d’estratègia"),
+ Tag(82, "Laboral"),
+ Tag(29, "Mecha"),
+ Tag(66, "Medicina"),
+ Tag(67, "Memòries"),
+ Tag(22, "Militar"),
+ Tag(32, "Mitologia"),
+ Tag(26, "Música"),
+ Tag(65, "Noies màgiques"),
+ Tag(36, "Paròdia"),
+ Tag(49, "Personatges adults"),
+ Tag(51, "Personatges bufons"),
+ Tag(63, "Polígon amorós"),
+ Tag(13, "Psicològic"),
+ Tag(52, "Puericultura"),
+ Tag(72, "Reencarnació"),
+ Tag(62, "Relaxant"),
+ Tag(74, "Rerefons romàntic"),
+ Tag(37, "Samurais"),
+ Tag(57, "Sang i fetge"),
+ Tag(40, "Superpoders"),
+ Tag(76, "Supervivència"),
+ Tag(80, "Tirana"),
+ Tag(45, "Transformisme"),
+ Tag(41, "Vampirs"),
+ Tag(78, "Viatges en el temps"),
+ Tag(79, "Videojocs"),
+ )
+
+ private interface UrlQueryFilter {
+ fun addQueryParameter(url: HttpUrl.Builder)
+ }
+
+ internal class MangaType(val id: String, name: String) : Filter.CheckBox(name)
+ internal class State(val id: Int, name: String) : Filter.CheckBox(name)
+ internal class Tag(val id: Int, name: String) : Filter.TriState(name)
+ internal class Demography(val id: Int, name: String) : Filter.CheckBox(name)
+
+ private class MangaTypeFilter(collection: String, mangaTypes: List) :
+ Filter.Group(collection, mangaTypes),
+ UrlQueryFilter {
+
+ override fun addQueryParameter(url: HttpUrl.Builder) {
+ var oneShotSelected = false
+ var serializedSelected = false
+ state.forEach { mangaType ->
+ if (mangaType.id.equals("oneshot") && mangaType.state) {
+ oneShotSelected = true
+ } else if (mangaType.id.equals("serialized") && mangaType.state) {
+ serializedSelected = true
+ }
+ }
+ if (oneShotSelected && !serializedSelected) {
+ url.addQueryParameter("type", "oneshot")
+ } else if (!oneShotSelected && serializedSelected) {
+ url.addQueryParameter("type", "serialized")
+ } else {
+ url.addQueryParameter("type", "all")
+ }
+ }
+ }
+
+ private class StateFilter(collection: String, states: List) :
+ Filter.Group(collection, states),
+ UrlQueryFilter {
+
+ override fun addQueryParameter(url: HttpUrl.Builder) {
+ state.forEach { state ->
+ if (state.state) {
+ url.addQueryParameter("status[]", state.id.toString())
+ }
+ }
+ }
+ }
+
+ private class DemographyFilter(collection: String, demographies: List) :
+ Filter.Group(collection, demographies),
+ UrlQueryFilter {
+
+ override fun addQueryParameter(url: HttpUrl.Builder) {
+ state.forEach { demography ->
+ if (demography.state) {
+ url.addQueryParameter("demographies[]", demography.id.toString())
+ }
+ }
+ }
+ }
+
+ private class GenreTagFilter(collection: String, tags: List) :
+ Filter.Group(collection, tags),
+ UrlQueryFilter {
+
+ override fun addQueryParameter(url: HttpUrl.Builder) {
+ state.forEach { tag ->
+ if (tag.isIncluded()) {
+ url.addQueryParameter("genres_include[]", tag.id.toString())
+ } else if (tag.isExcluded()) {
+ url.addQueryParameter("genres_exclude[]", tag.id.toString())
+ }
+ }
+ }
+ }
+
+ private class ThemeTagFilter(collection: String, tags: List) :
+ Filter.Group(collection, tags),
+ UrlQueryFilter {
+
+ override fun addQueryParameter(url: HttpUrl.Builder) {
+ state.forEach { tag ->
+ if (tag.isIncluded()) {
+ url.addQueryParameter("themes_include[]", tag.id.toString())
+ } else if (tag.isExcluded()) {
+ url.addQueryParameter("themes_exclude[]", tag.id.toString())
+ }
+ }
+ }
+ }
+}
diff --git a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/fansubscat/FansubsCatGenerator.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/fansubscat/FansubsCatGenerator.kt
new file mode 100644
index 0000000000..9271d2c6e5
--- /dev/null
+++ b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/fansubscat/FansubsCatGenerator.kt
@@ -0,0 +1,36 @@
+package eu.kanade.tachiyomi.multisrc.fansubscat
+
+import generator.ThemeSourceData.SingleLang
+import generator.ThemeSourceGenerator
+
+class FansubsCatGenerator : ThemeSourceGenerator {
+
+ override val themePkg = "fansubscat"
+
+ override val themeClass = "FansubsCat"
+
+ override val baseVersionCode = 4
+
+ override val sources = listOf(
+ SingleLang(
+ name = "Fansubs.cat",
+ baseUrl = "https://manga.fansubs.cat",
+ lang = "ca",
+ className = "FansubsCatMain",
+ isNsfw = false,
+ pkgName = "fansubscat",
+ ),
+ SingleLang(
+ name = "Fansubs.cat - Hentai",
+ baseUrl = "https://hentai.fansubs.cat/manga",
+ lang = "ca",
+ className = "FansubsCatHentai",
+ isNsfw = true,
+ ),
+ )
+
+ companion object {
+ @JvmStatic
+ fun main(args: Array) = FansubsCatGenerator().createAll()
+ }
+}
diff --git a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/flixscans/FlixScans.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/flixscans/FlixScans.kt
new file mode 100644
index 0000000000..51b56371c3
--- /dev/null
+++ b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/flixscans/FlixScans.kt
@@ -0,0 +1,314 @@
+package eu.kanade.tachiyomi.multisrc.flixscans
+
+import android.util.Log
+import eu.kanade.tachiyomi.network.GET
+import eu.kanade.tachiyomi.network.POST
+import eu.kanade.tachiyomi.network.asObservableSuccess
+import eu.kanade.tachiyomi.network.interceptor.rateLimit
+import eu.kanade.tachiyomi.network.interceptor.rateLimitHost
+import eu.kanade.tachiyomi.source.model.Filter
+import eu.kanade.tachiyomi.source.model.FilterList
+import eu.kanade.tachiyomi.source.model.MangasPage
+import eu.kanade.tachiyomi.source.model.Page
+import eu.kanade.tachiyomi.source.model.SChapter
+import eu.kanade.tachiyomi.source.model.SManga
+import eu.kanade.tachiyomi.source.online.HttpSource
+import kotlinx.serialization.decodeFromString
+import kotlinx.serialization.encodeToString
+import kotlinx.serialization.json.Json
+import okhttp3.Call
+import okhttp3.Callback
+import okhttp3.HttpUrl.Companion.toHttpUrl
+import okhttp3.MediaType.Companion.toMediaTypeOrNull
+import okhttp3.Request
+import okhttp3.RequestBody.Companion.toRequestBody
+import okhttp3.Response
+import rx.Observable
+import uy.kohesive.injekt.injectLazy
+
+abstract class FlixScans(
+ override val name: String,
+ override val baseUrl: String,
+ override val lang: String,
+ protected val apiUrl: String = baseUrl.replace("://", "://api.").plus("/api/v1"),
+ protected val cdnUrl: String = baseUrl.replace("://", "://api.").plus("/storage/"),
+) : HttpSource() {
+
+ override val supportsLatest = true
+
+ protected open val json: Json by injectLazy()
+
+ override val client = network.cloudflareClient.newBuilder()
+ .rateLimit(2)
+ .build()
+
+ // only returns 15 chapters each request, so using higher rate limit
+ private val chapterClient = network.cloudflareClient.newBuilder()
+ .rateLimitHost(apiUrl.toHttpUrl(), 1, 2)
+ .build()
+
+ override fun headersBuilder() = super.headersBuilder()
+ .add("Referer", baseUrl)
+
+ override fun fetchPopularManga(page: Int): Observable {
+ runCatching { fetchGenre() }
+
+ return super.fetchPopularManga(page)
+ }
+
+ override fun popularMangaRequest(page: Int): Request {
+ return GET("$apiUrl/webtoon/homepage/home", headers)
+ }
+
+ override fun popularMangaParse(response: Response): MangasPage {
+ val result = response.parseAs()
+
+ val entries = (result.hot + result.topAll + result.topMonth + result.topWeek)
+ .distinctBy { it.id }
+ .map { it.toSManga(cdnUrl) }
+
+ return MangasPage(entries, false)
+ }
+
+ override fun fetchLatestUpdates(page: Int): Observable {
+ runCatching { fetchGenre() }
+
+ return super.fetchLatestUpdates(page)
+ }
+
+ override fun latestUpdatesRequest(page: Int): Request {
+ return GET("$apiUrl/search/advance?page=$page&serie_type=webtoon", headers)
+ }
+
+ override fun latestUpdatesParse(response: Response): MangasPage {
+ val result = response.parseAs>()
+ val currentPage = response.request.url.queryParameter("page")
+ ?.toIntOrNull() ?: 1
+
+ val entries = result.data.map { it.toSManga(cdnUrl) }
+ val hasNextPage = result.meta.lastPage > currentPage
+
+ return MangasPage(entries, hasNextPage)
+ }
+
+ private var fetchGenreList: List = emptyList()
+ private var fetchGenreCallOngoing = false
+ private var fetchGenreFailed = false
+ private var fetchGenreAttempt = 0
+
+ private fun fetchGenre() {
+ if (fetchGenreAttempt < 3 && (fetchGenreList.isEmpty() || fetchGenreFailed) && !fetchGenreCallOngoing) {
+ fetchGenreCallOngoing = true
+
+ // fetch genre asynchronously as it sometimes hangs
+ client.newCall(fetchGenreRequest()).enqueue(fetchGenreCallback)
+ }
+ }
+
+ private val fetchGenreCallback = object : Callback {
+ override fun onFailure(call: Call, e: okio.IOException) {
+ fetchGenreAttempt++
+ fetchGenreFailed = true
+ fetchGenreCallOngoing = false
+
+ e.message?.let { Log.e("$name Filters", it) }
+ }
+
+ override fun onResponse(call: Call, response: Response) {
+ fetchGenreCallOngoing = false
+ fetchGenreAttempt++
+
+ if (!response.isSuccessful) {
+ fetchGenreFailed = true
+ response.close()
+
+ return
+ }
+
+ val parsed = runCatching {
+ response.use(::fetchGenreParse)
+ }
+
+ fetchGenreFailed = parsed.isFailure
+ fetchGenreList = parsed.getOrElse {
+ Log.e("$name Filters", it.stackTraceToString())
+ emptyList()
+ }
+ }
+ }
+
+ private fun fetchGenreRequest(): Request {
+ return GET("$apiUrl/search/genres", headers)
+ }
+
+ private fun fetchGenreParse(response: Response): List {
+ return response.parseAs>()
+ }
+
+ override fun getFilterList(): FilterList {
+ val filters: MutableList> = mutableListOf(
+ Filter.Header("Ignored when using Text Search"),
+ MainGenreFilter(),
+ TypeFilter(),
+ StatusFilter(),
+ )
+
+ filters += if (fetchGenreList.isNotEmpty()) {
+ listOf(
+ GenreFilter("Genre", fetchGenreList),
+ )
+ } else {
+ listOf(
+ Filter.Separator(),
+ Filter.Header("Press 'reset' to attempt to show Genres"),
+ )
+ }
+
+ return FilterList(filters)
+ }
+
+ override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable {
+ runCatching { fetchGenre() }
+
+ return super.fetchSearchManga(page, query, filters)
+ }
+
+ override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
+ if (query.isNotEmpty()) {
+ val requestBody = SearchInput(query.trim())
+ .let(json::encodeToString)
+ .toRequestBody(JSON_MEDIA_TYPE)
+
+ val newHeaders = headersBuilder()
+ .add("Content-Length", requestBody.contentLength().toString())
+ .add("Content-Type", requestBody.contentType().toString())
+ .build()
+
+ return POST("$apiUrl/search/serie?page=$page", newHeaders, requestBody)
+ }
+
+ val advSearchUrl = apiUrl.toHttpUrl().newBuilder().apply {
+ addPathSegments("search/advance")
+ addQueryParameter("page", page.toString())
+ addQueryParameter("serie_type", "webtoon")
+
+ filters.forEach { filter ->
+ when (filter) {
+ is GenreFilter -> {
+ filter.checked.let {
+ if (it.isNotEmpty()) {
+ addQueryParameter("genres", it.joinToString(","))
+ }
+ }
+ }
+ is MainGenreFilter -> {
+ if (filter.state > 0) {
+ addQueryParameter("main_genres", filter.selected)
+ }
+ }
+ is TypeFilter -> {
+ if (filter.state > 0) {
+ addQueryParameter("type", filter.selected)
+ }
+ }
+ is StatusFilter -> {
+ if (filter.state > 0) {
+ addQueryParameter("status", filter.selected)
+ }
+ }
+ else -> {}
+ }
+ }
+ }.build()
+
+ return GET(advSearchUrl, headers)
+ }
+
+ override fun searchMangaParse(response: Response) = latestUpdatesParse(response)
+
+ override fun mangaDetailsRequest(manga: SManga): Request {
+ val id = manga.url.split("-")[1]
+
+ return GET("$apiUrl/webtoon/series/$id", headers)
+ }
+
+ override fun getMangaUrl(manga: SManga) = baseUrl + manga.url
+
+ override fun mangaDetailsParse(response: Response): SManga {
+ val result = response.parseAs()
+
+ return result.serie.toSManga(cdnUrl)
+ }
+
+ override fun fetchChapterList(manga: SManga): Observable> {
+ return chapterClient.newCall(chapterListRequest(manga))
+ .asObservableSuccess()
+ .map(::chapterListParse)
+ }
+
+ override fun chapterListRequest(manga: SManga): Request {
+ val id = manga.url.split("-")[1]
+
+ return paginatedChapterListRequest(id)
+ }
+
+ private fun paginatedChapterListRequest(seriesID: String, page: Int = 1): Request {
+ return GET("$apiUrl/webtoon/chapters/$seriesID-asc?page=$page", headers)
+ }
+
+ override fun chapterListParse(response: Response): List {
+ val result = response.parseAs>()
+
+ val id = response.request.url.toString()
+ .substringAfterLast("/")
+ .substringBefore("-")
+
+ val chapters = result.data.toMutableList()
+
+ var page = 1
+
+ while (page < result.meta.lastPage) {
+ page++
+
+ val newResponse = chapterClient.newCall(paginatedChapterListRequest(id, page)).execute()
+
+ if (!newResponse.isSuccessful) {
+ newResponse.close()
+ continue
+ }
+
+ val newResult = newResponse.parseAs>()
+
+ chapters.addAll(newResult.data)
+ }
+
+ return chapters.map(Chapter::toSChapter).reversed()
+ }
+
+ override fun pageListRequest(chapter: SChapter): Request {
+ val id = chapter.url
+ .substringAfterLast("/")
+ .substringBefore("-")
+
+ return GET("$apiUrl/webtoon/chapters/chapter/$id", headers)
+ }
+
+ override fun getChapterUrl(chapter: SChapter) = baseUrl + chapter.url
+
+ override fun pageListParse(response: Response): List {
+ val result = response.parseAs()
+
+ return result.chapter.chapterData.webtoon.mapIndexed { i, img ->
+ Page(i, "", cdnUrl + img)
+ }
+ }
+
+ override fun imageUrlParse(response: Response) = throw UnsupportedOperationException("Not Used")
+
+ protected inline fun Response.parseAs(): T =
+ use { body.string() }.let(json::decodeFromString)
+
+ companion object {
+ private val JSON_MEDIA_TYPE = "application/json; charset=utf-8".toMediaTypeOrNull()
+ }
+}
diff --git a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/flixscans/FlixScansDto.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/flixscans/FlixScansDto.kt
new file mode 100644
index 0000000000..637841a38c
--- /dev/null
+++ b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/flixscans/FlixScansDto.kt
@@ -0,0 +1,146 @@
+package eu.kanade.tachiyomi.multisrc.flixscans
+
+import eu.kanade.tachiyomi.source.model.SChapter
+import eu.kanade.tachiyomi.source.model.SManga
+import kotlinx.serialization.SerialName
+import kotlinx.serialization.Serializable
+import org.jsoup.Jsoup
+import java.text.SimpleDateFormat
+import java.util.Locale
+
+@Serializable
+data class ApiResponse(
+ val data: List,
+ val meta: PageInfo,
+)
+
+@Serializable
+data class PageInfo(
+ @SerialName("last_page") val lastPage: Int,
+)
+
+@Serializable
+data class HomeDto(
+ val hot: List,
+ val topWeek: List,
+ val topMonth: List,
+ val topAll: List,
+)
+
+@Serializable
+data class BrowseSeries(
+ val id: Int,
+ val title: String,
+ val slug: String,
+ val prefix: Int,
+ val thumbnail: String?,
+) {
+ fun toSManga(cdnUrl: String) = SManga.create().apply {
+ title = this@BrowseSeries.title
+ url = "/series/$prefix-$id-$slug"
+ thumbnail_url = thumbnail?.let { cdnUrl + it }
+ }
+}
+
+@Serializable
+data class SearchInput(
+ val title: String,
+)
+
+@Serializable
+data class GenreHolder(
+ val name: String,
+ val id: Int,
+)
+
+@Serializable
+data class SeriesResponse(
+ val serie: Series,
+)
+
+@Serializable
+data class Series(
+ val id: Int,
+ val title: String,
+ val slug: String,
+ val prefix: Int,
+ val thumbnail: String?,
+ val story: String?,
+ val serieType: String?,
+ val mainGenres: String?,
+ val otherNames: List? = emptyList(),
+ val status: String?,
+ val type: String?,
+ val authors: List? = emptyList(),
+ val artists: List? = emptyList(),
+ val genres: List? = emptyList(),
+) {
+ fun toSManga(cdnUrl: String) = SManga.create().apply {
+ title = this@Series.title
+ url = "/series/$prefix-$id-$slug"
+ thumbnail_url = cdnUrl + thumbnail
+ author = authors?.joinToString { it.name.trim() }
+ artist = artists?.joinToString { it.name.trim() }
+ genre = (otherGenres + genres?.map { it.name.trim() }.orEmpty())
+ .distinct().joinToString { it.trim() }
+ description = story?.let { Jsoup.parse(it).text() }
+ if (otherNames?.isNotEmpty() == true) {
+ if (description.isNullOrEmpty()) {
+ description = "Alternative Names:\n"
+ } else {
+ description += "\n\nAlternative Names:\n"
+ }
+ description += otherNames.joinToString("\n") { "• ${it.trim()}" }
+ }
+ status = when (this@Series.status?.trim()) {
+ "ongoing" -> SManga.ONGOING
+ "completed" -> SManga.COMPLETED
+ "onhold" -> SManga.ON_HIATUS
+ else -> SManga.UNKNOWN
+ }
+ }
+
+ private val otherGenres = listOfNotNull(serieType, mainGenres, type)
+ .map { word ->
+ word.trim().replaceFirstChar {
+ if (it.isLowerCase()) {
+ it.titlecase(Locale.getDefault())
+ } else {
+ it.toString()
+ }
+ }
+ }
+}
+
+@Serializable
+data class Chapter(
+ val id: Int,
+ val name: String,
+ val slug: String,
+ val createdAt: String? = null,
+) {
+ fun toSChapter() = SChapter.create().apply {
+ url = "/read/webtoon/$id-$slug"
+ name = this@Chapter.name
+ date_upload = runCatching { dateFormat.parse(createdAt!!)!!.time }.getOrDefault(0L)
+ }
+
+ companion object {
+ val dateFormat = SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSSSSS'Z'", Locale.ENGLISH)
+ }
+}
+
+@Serializable
+data class PageListResponse(
+ val chapter: ChapterPages,
+)
+
+@Serializable
+data class ChapterPages(
+ val chapterData: ChapterPageData,
+)
+
+@Serializable
+data class ChapterPageData(
+ val webtoon: List,
+)
diff --git a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/flixscans/FlixScansGenerator.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/flixscans/FlixScansGenerator.kt
new file mode 100644
index 0000000000..0d49ac9623
--- /dev/null
+++ b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/flixscans/FlixScansGenerator.kt
@@ -0,0 +1,26 @@
+package eu.kanade.tachiyomi.multisrc.flixscans
+
+import generator.ThemeSourceData.SingleLang
+import generator.ThemeSourceGenerator
+
+class FlixScansGenerator : ThemeSourceGenerator {
+
+ override val themePkg = "flixscans"
+
+ override val themeClass = "FlixScans"
+
+ override val baseVersionCode: Int = 2
+
+ override val sources = listOf(
+ SingleLang("Flix Scans", "https://flixscans.net", "en", className = "FlixScansNet", pkgName = "flixscans"),
+ SingleLang("جالاكسي مانجا", "https://flixscans.com", "ar", className = "GalaxyManga", overrideVersionCode = 26),
+ SingleLang("مانجا نون", "https://manjanoon.com", "ar", className = "MangaNoon"),
+ )
+
+ companion object {
+ @JvmStatic
+ fun main(args: Array) {
+ FlixScansGenerator().createAll()
+ }
+ }
+}
diff --git a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/flixscans/FlixScansGenre.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/flixscans/FlixScansGenre.kt
new file mode 100644
index 0000000000..aebbe7813d
--- /dev/null
+++ b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/flixscans/FlixScansGenre.kt
@@ -0,0 +1,62 @@
+package eu.kanade.tachiyomi.multisrc.flixscans
+
+import eu.kanade.tachiyomi.source.model.Filter
+
+abstract class SelectFilter(
+ name: String,
+ private val options: List,
+) : Filter.Select(
+ name,
+ options.toTypedArray(),
+) {
+ val selected get() = options[state]
+}
+
+class CheckBoxFilter(
+ name: String,
+ val id: String,
+) : Filter.CheckBox(name)
+
+class GenreFilter(
+ name: String,
+ private val genres: List,
+) : Filter.Group(
+ name,
+ genres.map { CheckBoxFilter(it.name.trim(), it.id.toString()) },
+) {
+ val checked get() = state.filter { it.state }.map { it.id }
+}
+
+class MainGenreFilter : SelectFilter(
+ "Main Genre",
+ listOf(
+ "",
+ "fantasy",
+ "romance",
+ "action",
+ "drama",
+ ),
+)
+
+class TypeFilter : SelectFilter(
+ "Type",
+ listOf(
+ "",
+ "manhwa",
+ "manhua",
+ "manga",
+ "comic",
+ ),
+)
+
+class StatusFilter : SelectFilter(
+ "Status",
+ listOf(
+ "",
+ "ongoing",
+ "completed",
+ "droped",
+ "onhold",
+ "soon",
+ ),
+)
diff --git a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/fmreader/FMReader.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/fmreader/FMReader.kt
index 3873d626fa..dfb96dc114 100644
--- a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/fmreader/FMReader.kt
+++ b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/fmreader/FMReader.kt
@@ -19,7 +19,10 @@ import org.jsoup.nodes.Document
import org.jsoup.nodes.Element
import org.jsoup.select.Elements
import java.nio.charset.Charset
+import java.text.SimpleDateFormat
import java.util.Calendar
+import java.util.Locale
+
/**
* For sites based on the Flat-Manga CMS
*/
@@ -27,6 +30,7 @@ abstract class FMReader(
override val name: String,
override val baseUrl: String,
override val lang: String,
+ private val dateFormat: SimpleDateFormat = SimpleDateFormat("dd/MM/yyyy", Locale.ENGLISH),
) : ParsedHttpSource() {
override val supportsLatest = true
@@ -237,7 +241,7 @@ abstract class FMReader(
name = element.attr(chapterNameAttrSelector).substringAfter("$mangaTitle ")
}
}
- date_upload = element.select(chapterTimeSelector).let { if (it.hasText()) parseChapterDate(it.text()) else 0 }
+ date_upload = element.select(chapterTimeSelector).let { if (it.hasText()) parseRelativeDate(it.text()) else 0 }
}
}
@@ -247,7 +251,7 @@ abstract class FMReader(
// gets the unit of time (day, week hour) from "1 day ago"
open val dateWordIndex = 1
- private fun parseChapterDate(date: String): Long {
+ private fun parseRelativeDate(date: String): Long {
val value = date.split(' ')[dateValueIndex].toInt()
val dateWord = date.split(' ')[dateWordIndex].let {
if (it.contains("(")) {
@@ -294,6 +298,10 @@ abstract class FMReader(
}
}
}
+ open fun parseAbsoluteDate(dateStr: String): Long {
+ return runCatching { dateFormat.parse(dateStr)?.time }
+ .getOrNull() ?: 0L
+ }
open val pageListImageSelector = "img.chapter-img"
diff --git a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/fmreader/FMReaderGenerator.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/fmreader/FMReaderGenerator.kt
index 3f9996d177..46d824c505 100644
--- a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/fmreader/FMReaderGenerator.kt
+++ b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/fmreader/FMReaderGenerator.kt
@@ -13,16 +13,16 @@ class FMReaderGenerator : ThemeSourceGenerator {
override val baseVersionCode: Int = 8
override val sources = listOf(
- MultiLang("Manhwa18.net", "https://manhwa18.net", listOf("en", "ko"), className = "Manhwa18NetFactory", isNsfw = true),
+ MultiLang("Manhwa18.net", "https://manhwa18.net", listOf("en", "ko"), className = "Manhwa18NetFactory", isNsfw = true, overrideVersionCode = 1),
SingleLang("Epik Manga", "https://www.epikmanga.com", "tr"),
- SingleLang("KissLove", "https://klmanga.com", "ja", overrideVersionCode = 2),
+ SingleLang("KissLove", "https://klz9.com", "ja", isNsfw = true, overrideVersionCode = 4),
SingleLang("Manga-TR", "https://manga-tr.com", "tr", className = "MangaTR", overrideVersionCode = 1),
SingleLang("ManhuaRock", "https://manhuarock.net", "vi", overrideVersionCode = 1),
SingleLang("Manhwa18", "https://manhwa18.com", "en", isNsfw = true, overrideVersionCode = 2),
SingleLang("Say Truyen", "https://saytruyenvip.com", "vi", overrideVersionCode = 3),
- SingleLang("WeLoveManga", "https://weloma.art", "ja", pkgName = "rawlh", overrideVersionCode = 4),
+ SingleLang("WeLoveManga", "https://weloma.art", "ja", pkgName = "rawlh", isNsfw = true, overrideVersionCode = 5),
SingleLang("Manga1000", "https://manga1000.top", "ja"),
- SingleLang("WeLoveMangaOne", "https://welovemanga.one", "ja"),
+ SingleLang("WeLoveMangaOne", "https://welovemanga.one", "ja", isNsfw = true, overrideVersionCode = 1),
)
companion object {
diff --git a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/grouple/GroupLe.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/grouple/GroupLe.kt
index 3c8787a696..3f3b61d608 100644
--- a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/grouple/GroupLe.kt
+++ b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/grouple/GroupLe.kt
@@ -150,14 +150,14 @@ abstract class GroupLe(
else -> rawAgeValue
}
val manga = SManga.create()
- manga.title = document.select("h1.names .name").text()
+ manga.title = document.select(".names > .name").text()
manga.author = infoElement.select("span.elem_author").first()?.text() ?: infoElement.select(
"span.elem_screenwriter",
).first()?.text()
manga.artist = infoElement.select("span.elem_illustrator").first()?.text()
manga.genre = (
- "$category, $rawAgeStop, " + infoElement.select("span.elem_genre")
- .text() + ", " + infoElement.select("span.elem_tag").text()
+ "$category, $rawAgeStop, " + infoElement.select("p:contains(Жанры:) a, p:contains(Теги:) a")
+ .joinToString { it.text() }
).split(", ")
.filter { it.isNotEmpty() }.joinToString { it.trim().lowercase() }
val altName = if (infoElement.select(".another-names").isNotEmpty()) {
@@ -179,6 +179,7 @@ abstract class GroupLe(
"продолжается" -> SManga.ONGOING
"начат" -> SManga.ONGOING
"переведено" -> SManga.COMPLETED
+ "завершён" -> SManga.COMPLETED
"приостановлен" -> SManga.ON_HIATUS
else -> SManga.UNKNOWN
}
@@ -201,7 +202,7 @@ abstract class GroupLe(
private fun chapterListParse(response: Response, manga: SManga): List {
val document = response.asJsoup()
- if ((document.select(".expandable.hide-dn").isNotEmpty() || document.select("img.logo").first()?.attr("title")?.contains("Allhentai") == true) && document.select(".user-avatar").isNullOrEmpty()) {
+ if ((document.select(".expandable.hide-dn").isNotEmpty() && document.select(".user-avatar").isNullOrEmpty() && document.toString().contains("current_user_country_code = 'RU'")) || (document.select("img.logo").first()?.attr("title")?.contains("Allhentai") == true && document.select(".user-avatar").isNullOrEmpty())) {
throw Exception("Для просмотра контента необходима авторизация через WebView\uD83C\uDF0E")
}
return document.select(chapterListSelector()).map { chapterFromElement(it, manga) }
diff --git a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/grouple/GroupLeGenerator.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/grouple/GroupLeGenerator.kt
index 8d775ba569..c740ecf920 100644
--- a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/grouple/GroupLeGenerator.kt
+++ b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/grouple/GroupLeGenerator.kt
@@ -9,12 +9,12 @@ class GroupLeGenerator : ThemeSourceGenerator {
override val themeClass = "GroupLe"
- override val baseVersionCode = 15
+ override val baseVersionCode = 20
override val sources = listOf(
SingleLang("ReadManga", "https://readmanga.live", "ru", overrideVersionCode = 46),
- SingleLang("MintManga", "https://mintmanga.live", "ru", overrideVersionCode = 46),
- SingleLang("AllHentai", "https://2023.allhen.online", "ru", isNsfw = true, overrideVersionCode = 22),
+ SingleLang("MintManga", "https://mintmanga.com", "ru", isNsfw = true, overrideVersionCode = 46),
+ SingleLang("AllHentai", "https://z.allhen.online", "ru", isNsfw = true, overrideVersionCode = 22),
SingleLang("SelfManga", "https://selfmanga.live", "ru", overrideVersionCode = 22),
SingleLang("RuMIX", "https://rumix.me", "ru", overrideVersionCode = 1),
)
diff --git a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/heancms/HeanCms.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/heancms/HeanCms.kt
index e0c96d501a..9cf9660d3f 100644
--- a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/heancms/HeanCms.kt
+++ b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/heancms/HeanCms.kt
@@ -1,7 +1,12 @@
package eu.kanade.tachiyomi.multisrc.heancms
+import android.app.Application
+import android.content.SharedPreferences
+import androidx.preference.PreferenceScreen
+import androidx.preference.SwitchPreferenceCompat
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.network.POST
+import eu.kanade.tachiyomi.source.ConfigurableSource
import eu.kanade.tachiyomi.source.model.Filter
import eu.kanade.tachiyomi.source.model.FilterList
import eu.kanade.tachiyomi.source.model.MangasPage
@@ -9,16 +14,21 @@ import eu.kanade.tachiyomi.source.model.Page
import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.HttpSource
+import eu.kanade.tachiyomi.util.asJsoup
import kotlinx.serialization.decodeFromString
import kotlinx.serialization.encodeToString
import kotlinx.serialization.json.Json
import okhttp3.Headers
+import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.MediaType.Companion.toMediaType
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.RequestBody.Companion.toRequestBody
import okhttp3.Response
import rx.Observable
+import uy.kohesive.injekt.Injekt
+import uy.kohesive.injekt.api.get
+import java.io.IOException
import java.text.SimpleDateFormat
import java.util.Locale
@@ -27,12 +37,38 @@ abstract class HeanCms(
override val baseUrl: String,
override val lang: String,
protected val apiUrl: String = baseUrl.replace("://", "://api."),
-) : HttpSource() {
+) : ConfigurableSource, HttpSource() {
+
+ private val preferences: SharedPreferences by lazy {
+ Injekt.get