commit a1bd42f288e51c6610b4e67b3faf25fd78b7ef7b Author: keiyoushi-bot <156378334+keiyoushi-bot@users.noreply.github.com> Date: Tue Jan 9 04:12:39 2024 +0600 Initial commit diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 000000000..ebf0322a0 --- /dev/null +++ b/.editorconfig @@ -0,0 +1,19 @@ +# Editor configuration, see https://editorconfig.org +root = true + +[*.kt] +charset = utf-8 +end_of_line = lf +indent_size = 4 +indent_style = space +insert_final_newline = true +trim_trailing_whitespace = true +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/01_report_issue.yml b/.github/ISSUE_TEMPLATE/01_report_issue.yml new file mode 100644 index 000000000..09c785644 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/01_report_issue.yml @@ -0,0 +1,107 @@ +name: 🐞 Issue report +description: Report a source issue in Tachiyomi +labels: [Bug] +body: + + - type: input + id: source + attributes: + label: Source information + description: | + You can find the extension name and version in **Browse → Extensions**. + placeholder: | + Example: "Mangahere 1.3.18" + validations: + required: true + + - type: input + id: language + attributes: + label: Source language + placeholder: | + Example: "English" + validations: + required: true + + - type: textarea + id: reproduce-steps + attributes: + label: Steps to reproduce + description: Provide an example of the issue. + placeholder: | + Example: + 1. First step + 2. Second step + 3. Issue here + validations: + required: true + + - type: textarea + id: expected-behavior + attributes: + label: Expected behavior + placeholder: | + Example: + "This should happen..." + validations: + required: true + + - type: textarea + id: actual-behavior + attributes: + label: Actual behavior + placeholder: | + Example: + "This happened instead..." + validations: + required: true + + - type: input + id: tachiyomi-version + attributes: + label: Tachiyomi version + description: | + You can find your Tachiyomi version in **More → About**. + placeholder: | + Example: "0.15.1" + validations: + required: true + + - type: input + id: android-version + attributes: + label: Android version + description: | + You can find this somewhere in your Android settings. + placeholder: | + Example: "Android 11" + validations: + required: true + + - type: textarea + id: other-details + attributes: + label: Other details + placeholder: | + Additional details and attachments. + + - type: checkboxes + id: acknowledgements + attributes: + 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 the app to version **[0.15.1](https://github.com/tachiyomiorg/tachiyomi/releases/latest)**. + required: true + - label: I have updated all installed extensions. + required: true + - label: I have tried the [troubleshooting guide](https://tachiyomi.org/help/guides/troubleshooting/). + 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 will fill out all of the requested information in this form. + required: true diff --git a/.github/ISSUE_TEMPLATE/02_request_source.yml b/.github/ISSUE_TEMPLATE/02_request_source.yml new file mode 100644 index 000000000..9dd4042f6 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/02_request_source.yml @@ -0,0 +1,55 @@ +name: 🌐 Source request +description: Suggest a new source for Tachiyomi +labels: [Source request] +body: + + - type: input + id: name + attributes: + label: Source name + placeholder: | + Example: "Not Real Scans" + validations: + required: true + + - type: input + id: link + attributes: + label: Source link + placeholder: | + Example: "https://notrealscans.org" + validations: + required: true + + - type: input + id: language + attributes: + label: Source language + placeholder: | + Example: "English" + validations: + required: true + + - type: textarea + id: other-details + attributes: + label: Other details + placeholder: | + Additional details and attachments. + Example: + "18+/NSFW = yes" + + - type: checkboxes + id: acknowledgements + attributes: + label: Acknowledgements + description: Your issue will be closed if you haven't done these steps. + options: + - label: I have checked that the extension does not already exist by searching the [GitHub repository](https://github.com/keiyoushi/extensions-source/) and verified it does not appear in the code base. + 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/03_report_url_change.yml b/.github/ISSUE_TEMPLATE/03_report_url_change.yml new file mode 100644 index 000000000..80646a718 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/03_report_url_change.yml @@ -0,0 +1,57 @@ +name: 🔗 URL change report +description: Report URL change of an existing source +labels: [Bug,Domain changed] +body: + + - type: input + id: source + attributes: + label: Source information + description: | + You can find the extension name and version in **Browse → Extensions**. + placeholder: | + Example: "NotRealScans 1.3.1" + validations: + required: true + + - type: input + id: language + attributes: + label: Source language + placeholder: | + Example: "English" + validations: + required: true + + - type: input + id: link + attributes: + label: Source new URL + placeholder: | + Example: "https://notrealscans.org" + validations: + required: true + + - type: textarea + id: other-details + attributes: + label: Other details + placeholder: | + Additional details and attachments. + + - type: checkboxes + id: acknowledgements + attributes: + label: Acknowledgements + description: Your issue will be closed if you haven't done these steps. + options: + - 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 new file mode 100644 index 000000000..69ca7a555 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/04_report_dead_source.yml @@ -0,0 +1,63 @@ +name: ❌ Dead source report +description: Source is down and website is closed +labels: [Source is down] +body: + + - type: markdown + attributes: + value: | + ### Notice + If you have a lot of dead sources to report, please go back and submit a single meta request. + + - type: input + id: source + attributes: + label: Source name + description: | + You can find the extension name in **Browse → Extensions**. + placeholder: | + Example: "NotRealScans" + validations: + required: true + + - type: input + id: language + attributes: + label: Source language + placeholder: | + Example: "English" + validations: + required: true + + - type: input + id: link + attributes: + label: Source link + placeholder: | + Example: "https://notrealscans.org" + validations: + required: true + + - type: textarea + id: other-details + attributes: + label: Other details + placeholder: | + Additional details and attachments. + + - type: checkboxes + id: acknowledgements + attributes: + label: Acknowledgements + description: Your issue will be closed if you haven't done these steps. + options: + - 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 new file mode 100644 index 000000000..7375eb0a3 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/05_request_feature.yml @@ -0,0 +1,59 @@ +name: ⭐ Feature request +description: Suggest a feature to improve an existing source +labels: [Feature request] +body: + + - type: input + id: source + attributes: + label: Source name + description: | + You can find the extension name in **Browse → Extensions**. + placeholder: | + Example: "Mangahere" + validations: + required: true + + - type: input + id: language + attributes: + label: Source language + placeholder: | + Example: "English" + validations: + required: true + + - type: textarea + id: feature-description + attributes: + label: Describe your suggested feature + description: How can an existing extension be improved? + placeholder: | + Example: + "It should work like this..." + validations: + required: true + + - type: textarea + id: other-details + attributes: + label: Other details + placeholder: | + Additional details and attachments. + + - type: checkboxes + id: acknowledgements + attributes: + 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: 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.15.1](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 new file mode 100644 index 000000000..a18675071 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/06_request_meta.yml @@ -0,0 +1,41 @@ +name: 🧠 Meta request +description: Suggest improvements to the project +labels: [Meta request] +body: + + - type: textarea + id: feature-description + attributes: + label: Describe why this should be added + description: How can the project be improved? + placeholder: | + Example: + "It should work like this..." + validations: + required: true + + - type: textarea + id: other-details + attributes: + label: Other details + placeholder: | + Additional details and attachments. + + - type: checkboxes + id: acknowledgements + attributes: + 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: 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.15.1](https://github.com/tachiyomiorg/tachiyomi/releases/latest)**. + required: true + - label: I have updated all installed extensions. + required: true + - label: I will fill out all of the requested information in this form. + required: true diff --git a/.github/ISSUE_TEMPLATE/config.yml b/.github/ISSUE_TEMPLATE/config.yml new file mode 100644 index 000000000..b2043de40 --- /dev/null +++ b/.github/ISSUE_TEMPLATE/config.yml @@ -0,0 +1,11 @@ +blank_issues_enabled: false +contact_links: + - name: ⚠️ Application issue + url: https://github.com/tachiyomiorg/tachiyomi/issues/new/choose + about: Issues and requests about the app itself should be opened in the tachiyomi repository instead + - name: 📦 Tachiyomi official extensions + url: https://tachiyomi.org/extensions + about: List of all available official extensions with download links + - name: 🖥️ Tachiyomi website + url: https://tachiyomi.org/help/ + about: Guides, troubleshooting, and answers to common questions diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md new file mode 100644 index 000000000..5e2efbb8f --- /dev/null +++ b/.github/pull_request_template.md @@ -0,0 +1,9 @@ +Checklist: + +- [ ] Updated `extVersionCode` value in `build.gradle` for individual extensions +- [ ] Updated `overrideVersionCode` or `baseVersionCode` as needed for all multisrc extensions +- [ ] Referenced all related issues in the PR body (e.g. "Closes #xyz") +- [ ] Added the `isNsfw = true` flag in `build.gradle` when appropriate +- [ ] Have not changed source names +- [ ] Have explicitly kept the `id` if a source's name or language were changed +- [ ] Have tested the modifications by compiling and running the extension through Android Studio diff --git a/.github/renovate.json b/.github/renovate.json new file mode 100644 index 000000000..e5fd01883 --- /dev/null +++ b/.github/renovate.json @@ -0,0 +1,8 @@ +{ + "extends": [ + "config:base" + ], + "includePaths": [ + ".github/**" + ] +} diff --git a/.github/scripts/commit-repo.sh b/.github/scripts/commit-repo.sh new file mode 100755 index 000000000..38622234e --- /dev/null +++ b/.github/scripts/commit-repo.sh @@ -0,0 +1,14 @@ +#!/bin/bash +set -e + +rsync -a --delete --exclude .git --exclude .gitignore --exclude README.md ../main/repo/ . +git config --global user.email "107297513+FourTOne5@users.noreply.github.com" +git config --global user.name "FourTOne5" +git status +if [ -n "$(git status --porcelain)" ]; then + git add . + git commit -m "Update extensions repo" + git push +else + echo "No changes to commit" +fi diff --git a/.github/scripts/create-repo.sh b/.github/scripts/create-repo.sh new file mode 100755 index 000000000..aeb61cb37 --- /dev/null +++ b/.github/scripts/create-repo.sh @@ -0,0 +1,66 @@ +#!/bin/bash +set -e + +TOOLS="$(ls -d ${ANDROID_HOME}/build-tools/* | tail -1)" + +mkdir -p repo/apk +mkdir -p repo/icon + +cp -f apk/* repo/apk + +cd repo + +APKS=( ../apk/*".apk" ) + +for APK in ${APKS[@]}; do + FILENAME=$(basename ${APK}) + BADGING="$(${TOOLS}/aapt dump --include-meta-data badging $APK)" + + PACKAGE=$(echo "$BADGING" | grep package:) + PKGNAME=$(echo $PACKAGE | grep -Po "package: name='\K[^']+") + VCODE=$(echo $PACKAGE | grep -Po "versionCode='\K[^']+") + VNAME=$(echo $PACKAGE | grep -Po "versionName='\K[^']+") + NSFW=$(echo $BADGING | grep -Po "tachiyomi.extension.nsfw' value='\K[^']+") + HASREADME=$(echo $BADGING | grep -Po "tachiyomi.extension.hasReadme' value='\K[^']+") + HASCHANGELOG=$(echo $BADGING | grep -Po "tachiyomi.extension.hasChangelog' value='\K[^']+") + + APPLICATION=$(echo "$BADGING" | grep application:) + LABEL=$(echo $APPLICATION | grep -Po "label='\K[^']+") + + LANG=$(echo $APK | grep -Po "tachiyomi-\K[^\.]+") + + ICON=$(echo "$BADGING" | grep -Po "application-icon-320.*'\K[^']+") + unzip -p $APK $ICON > icon/${PKGNAME}.png + + SOURCE_INFO=$(jq ".[\"$PKGNAME\"]" < ../output.json) + + # Fixes the language code without needing to update the packages. + SOURCE_LEN=$(echo $SOURCE_INFO | jq length) + + if [ $SOURCE_LEN = "1" ]; then + SOURCE_LANG=$(echo $SOURCE_INFO | jq -r '.[0].lang') + + if [ $SOURCE_LANG != $LANG ] && [ $SOURCE_LANG != "all" ] && [ $SOURCE_LANG != "other" ] && [ $LANG != "all" ] && [ $LANG != "other" ]; then + LANG=$SOURCE_LANG + fi + fi + + jq -n \ + --arg name "$LABEL" \ + --arg pkg "$PKGNAME" \ + --arg apk "$FILENAME" \ + --arg lang "$LANG" \ + --argjson code $VCODE \ + --arg version "$VNAME" \ + --argjson nsfw $NSFW \ + --argjson hasReadme $HASREADME \ + --argjson hasChangelog $HASCHANGELOG \ + --argjson sources "$SOURCE_INFO" \ + '{name:$name, pkg:$pkg, apk:$apk, lang:$lang, code:$code, version:$version, nsfw:$nsfw, hasReadme:$hasReadme, hasChangelog:$hasChangelog, sources:$sources}' + +done | jq -sr '[.[]]' > index.json + +# Alternate minified copy +jq -c '.' < index.json > index.min.json + +cat index.json diff --git a/.github/scripts/move-apks.sh b/.github/scripts/move-apks.sh new file mode 100755 index 000000000..b90bde6a9 --- /dev/null +++ b/.github/scripts/move-apks.sh @@ -0,0 +1,26 @@ +#!/bin/bash +set -e +shopt -s globstar nullglob extglob + +# Get APKs from previous jobs' artifacts +cp -R ~/apk-artifacts/ $PWD +APKS=( **/*".apk" ) + +# Fail if too little extensions seem to have been built +#if [ "${#APKS[@]}" -le "100" ]; then +# echo "Insufficient amount of APKs found. Please check the project configuration." +# exit 1 +#else +# echo "Moving ${#APKS[@]} APKs" +#fi + +DEST=$PWD/apk +rm -rf $DEST && mkdir -p $DEST + +for APK in ${APKS[@]}; do + BASENAME=$(basename $APK) + APKNAME="${BASENAME%%+(-release*)}.apk" + APKDEST="$DEST/$APKNAME" + + cp $APK $APKDEST +done diff --git a/.github/workflows/batch_close_issues.yml b/.github/workflows/batch_close_issues.yml new file mode 100644 index 000000000..3051b36e1 --- /dev/null +++ b/.github/workflows/batch_close_issues.yml @@ -0,0 +1,25 @@ +name: "Batch close stale issues" + +on: + # Monthly + schedule: + - cron: '0 0 1 * *' + # Manual trigger + workflow_dispatch: + inputs: + +jobs: + stale: + runs-on: ubuntu-latest + steps: + - uses: actions/stale@v9 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + # Close everything older than a year + days-before-issue-stale: 365 + days-before-issue-close: 0 + exempt-issue-labels: "do-not-autoclose,Meta request" + close-issue-message: "In an effort to have a more manageable issue backlog, we're closing older requests that weren't addressed since there's a low chance of it being addressed if it hasn't already. If your request is still relevant, please [open a new request](https://github.com/keiyoushi/extensions-source/issues/new/choose)." + close-issue-reason: not_planned + ascending: true + operations-per-run: 250 diff --git a/.github/workflows/build_pull_request.yml b/.github/workflows/build_pull_request.yml new file mode 100644 index 000000000..bc6677254 --- /dev/null +++ b/.github/workflows/build_pull_request.yml @@ -0,0 +1,157 @@ +name: PR build check + +on: + pull_request: + paths-ignore: + - '**.md' + - '.github/workflows/issue_moderator.yml' + +concurrency: + group: ${{ github.workflow }}-${{ github.event.pull_request.number }} + cancel-in-progress: true + +env: + CI_CHUNK_SIZE: 65 + +jobs: + prepare: + name: Prepare job + runs-on: ubuntu-latest + outputs: + individualMatrix: ${{ steps.generate-matrices.outputs.individualMatrix }} + multisrcMatrix: ${{ steps.generate-matrices.outputs.multisrcMatrix }} + isIndividualChanged: ${{ steps.parse-changed-files.outputs.isIndividualChanged }} + isMultisrcChanged: ${{ steps.parse-changed-files.outputs.isMultisrcChanged }} + env: + CI_MODULE_GEN: true + steps: + - name: Clone repo + uses: actions/checkout@v4 + + - name: Validate Gradle Wrapper + uses: gradle/wrapper-validation-action@v1 + + - name: Set up JDK + uses: actions/setup-java@v4 + with: + java-version: 11 + distribution: adopt + + - id: get-changed-files + name: Get changed files + uses: Ana06/get-changed-files@v2.2.0 + + - id: parse-changed-files + name: Parse changed files + run: | + isIndividualChanged=0 + isMultisrcChanged=0 + for changedFile in ${{ steps.get-changed-files.outputs.all }}; do + if [[ ${changedFile} == src/* ]]; then + isIndividualChanged=1 + elif [[ ${changedFile} == multisrc/* ]]; then + isMultisrcChanged=1 + elif [[ ${changedFile} == .github/workflows/issue_moderator.yml ]]; then + true + elif [[ ${changedFile} == *.md ]]; then + true + else + isIndividualChanged=1 + isMultisrcChanged=1 + break + fi + done + echo "isIndividualChanged=$isIndividualChanged" >> $GITHUB_OUTPUT + echo "isMultisrcChanged=$isMultisrcChanged" >> $GITHUB_OUTPUT + + - name: Generate multisrc sources + if: ${{ steps.parse-changed-files.outputs.isMultisrcChanged == '1' }} + uses: gradle/gradle-build-action@v2 + with: + arguments: :multisrc:generateExtensions + + - name: Get number of modules + run: | + set -x + ./gradlew -q projects | grep '.*extensions\:\(individual\|multisrc\)\:.*\:.*' > projects.txt + + echo "NUM_INDIVIDUAL_MODULES=$(cat projects.txt | grep '.*\:individual\:.*' | wc -l)" >> $GITHUB_ENV + echo "NUM_MULTISRC_MODULES=$(cat projects.txt | grep '.*\:multisrc\:.*' | wc -l)" >> $GITHUB_ENV + + - id: generate-matrices + name: Create output matrices + uses: actions/github-script@v7 + with: + script: | + const numIndividualModules = process.env.NUM_INDIVIDUAL_MODULES; + const numMultisrcModules = process.env.NUM_MULTISRC_MODULES; + const chunkSize = process.env.CI_CHUNK_SIZE; + + const numIndividualChunks = Math.ceil(numIndividualModules / chunkSize); + const numMultisrcChunks = Math.ceil(numMultisrcModules / chunkSize); + + console.log(`Individual modules: ${numIndividualModules} (${numIndividualChunks} chunks of ${chunkSize})`); + console.log(`Multi-source modules: ${numMultisrcModules} (${numMultisrcChunks} chunks of ${chunkSize})`); + + core.setOutput('individualMatrix', { 'chunk': [...Array(numIndividualChunks).keys()] }); + core.setOutput('multisrcMatrix', { 'chunk': [...Array(numMultisrcChunks).keys()] }); + + build_multisrc: + name: Build multisrc modules + needs: prepare + if: ${{ needs.prepare.outputs.isMultisrcChanged == '1' }} + runs-on: ubuntu-latest + strategy: + matrix: ${{ fromJSON(needs.prepare.outputs.multisrcMatrix) }} + steps: + - name: Checkout PR + uses: actions/checkout@v4 + + - name: Set up JDK + uses: actions/setup-java@v4 + with: + java-version: 11 + distribution: adopt + + - name: Generate sources from the multi-source library + uses: gradle/gradle-build-action@v2 + env: + CI_MODULE_GEN: "true" + with: + arguments: :multisrc:generateExtensions + cache-read-only: true + + - name: Build extensions (chunk ${{ matrix.chunk }}) + uses: gradle/gradle-build-action@v2 + env: + CI_MULTISRC: "true" + CI_CHUNK_NUM: ${{ matrix.chunk }} + with: + arguments: assembleDebug + cache-read-only: true + + build_individual: + name: Build individual modules + needs: prepare + if: ${{ needs.prepare.outputs.isIndividualChanged == '1' }} + runs-on: ubuntu-latest + strategy: + matrix: ${{ fromJSON(needs.prepare.outputs.individualMatrix) }} + steps: + - name: Checkout PR + uses: actions/checkout@v4 + + - name: Set up JDK + uses: actions/setup-java@v4 + with: + java-version: 11 + distribution: adopt + + - name: Build extensions (chunk ${{ matrix.chunk }}) + uses: gradle/gradle-build-action@v2 + env: + CI_MULTISRC: "false" + CI_CHUNK_NUM: ${{ matrix.chunk }} + with: + arguments: assembleDebug + cache-read-only: true diff --git a/.github/workflows/build_push.yml b/.github/workflows/build_push.yml new file mode 100644 index 000000000..bb7f5994d --- /dev/null +++ b/.github/workflows/build_push.yml @@ -0,0 +1,207 @@ +name: CI + +on: + push: + branches: + - main + paths-ignore: + - '**.md' + - '.github/workflows/issue_moderator.yml' + +concurrency: + group: ${{ github.workflow }} + cancel-in-progress: true + +env: + CI_CHUNK_SIZE: 65 + +jobs: + prepare: + name: Prepare job + runs-on: ubuntu-latest + outputs: + individualMatrix: ${{ steps.generate-matrices.outputs.individualMatrix }} + multisrcMatrix: ${{ steps.generate-matrices.outputs.multisrcMatrix }} + env: + CI_MODULE_GEN: true + steps: + - name: Clone repo + uses: actions/checkout@v4 + + - name: Validate Gradle Wrapper + uses: gradle/wrapper-validation-action@v1 + + - name: Set up JDK + uses: actions/setup-java@v4 + with: + java-version: 11 + distribution: adopt + + - name: Generate multisrc sources + uses: gradle/gradle-build-action@v2 + with: + arguments: :multisrc:generateExtensions + + - name: Get number of modules + run: | + set -x + ./gradlew -q projects | grep '.*extensions\:\(individual\|multisrc\)\:.*\:.*' > projects.txt + + echo "NUM_INDIVIDUAL_MODULES=$(cat projects.txt | grep '.*\:individual\:.*' | wc -l)" >> $GITHUB_ENV + echo "NUM_MULTISRC_MODULES=$(cat projects.txt | grep '.*\:multisrc\:.*' | wc -l)" >> $GITHUB_ENV + + - id: generate-matrices + name: Create output matrices + uses: actions/github-script@v7 + with: + script: | + const numIndividualModules = process.env.NUM_INDIVIDUAL_MODULES; + const numMultisrcModules = process.env.NUM_MULTISRC_MODULES; + const chunkSize = process.env.CI_CHUNK_SIZE; + + const numIndividualChunks = Math.ceil(numIndividualModules / chunkSize); + const numMultisrcChunks = Math.ceil(numMultisrcModules / chunkSize); + + console.log(`Individual modules: ${numIndividualModules} (${numIndividualChunks} chunks of ${chunkSize})`); + console.log(`Multi-source modules: ${numMultisrcModules} (${numMultisrcChunks} chunks of ${chunkSize})`); + + core.setOutput('individualMatrix', { 'chunk': [...Array(numIndividualChunks).keys()] }); + core.setOutput('multisrcMatrix', { 'chunk': [...Array(numMultisrcChunks).keys()] }); + + build_multisrc: + name: Build multisrc modules + needs: prepare + runs-on: ubuntu-latest + strategy: + matrix: ${{ fromJSON(needs.prepare.outputs.multisrcMatrix) }} + steps: + - name: Checkout main branch + uses: actions/checkout@v4 + + - name: Set up JDK + uses: actions/setup-java@v4 + with: + java-version: 11 + distribution: adopt + + - name: Prepare signing key + run: | + echo ${{ secrets.SIGNING_KEY }} | base64 -d > signingkey.jks + + - name: Generate sources from the multi-source library + uses: gradle/gradle-build-action@v2 + env: + CI_MODULE_GEN: "true" + with: + arguments: :multisrc:generateExtensions + + - name: Build extensions (chunk ${{ matrix.chunk }}) + uses: gradle/gradle-build-action@v2 + env: + CI_MULTISRC: "true" + CI_CHUNK_NUM: ${{ matrix.chunk }} + ALIAS: ${{ secrets.ALIAS }} + KEY_STORE_PASSWORD: ${{ secrets.KEY_STORE_PASSWORD }} + KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }} + with: + arguments: assembleRelease + + - name: Upload APKs (chunk ${{ matrix.chunk }}) + uses: actions/upload-artifact@v4 + if: "github.repository == 'keiyoushi/extensions-source'" + with: + name: "multisrc-apks-${{ matrix.chunk }}" + path: "**/*.apk" + retention-days: 1 + + - name: Clean up CI files + run: rm signingkey.jks + + build_individual: + name: Build individual modules + needs: prepare + runs-on: ubuntu-latest + strategy: + matrix: ${{ fromJSON(needs.prepare.outputs.individualMatrix) }} + steps: + - name: Checkout main branch + uses: actions/checkout@v4 + + - name: Set up JDK + uses: actions/setup-java@v4 + with: + java-version: 11 + distribution: adopt + + - name: Prepare signing key + run: | + echo ${{ secrets.SIGNING_KEY }} | base64 -d > signingkey.jks + + - name: Build extensions (chunk ${{ matrix.chunk }}) + uses: gradle/gradle-build-action@v2 + env: + CI_MULTISRC: "false" + CI_CHUNK_NUM: ${{ matrix.chunk }} + ALIAS: ${{ secrets.ALIAS }} + KEY_STORE_PASSWORD: ${{ secrets.KEY_STORE_PASSWORD }} + KEY_PASSWORD: ${{ secrets.KEY_PASSWORD }} + with: + arguments: assembleRelease + + - name: Upload APKs (chunk ${{ matrix.chunk }}) + uses: actions/upload-artifact@v4 + if: "github.repository == 'keiyoushi/extensions-source'" + with: + name: "individual-apks-${{ matrix.chunk }}" + path: "**/*.apk" + retention-days: 1 + + - name: Clean up CI files + run: rm signingkey.jks + + publish_repo: + name: Publish repo + needs: + - build_multisrc + - build_individual + if: "github.repository == 'keiyoushi/extensions-source'" + runs-on: ubuntu-latest + steps: + - name: Download APK artifacts + uses: actions/download-artifact@v4 + with: + path: ~/apk-artifacts + + - name: Set up JDK + uses: actions/setup-java@v4 + with: + java-version: 17 + distribution: adopt + + - name: Checkout main branch + uses: actions/checkout@v4 + with: + ref: main + path: main + + - name: Create repo artifacts + run: | + cd main + ./.github/scripts/move-apks.sh + INSPECTOR_LINK="$(curl -s "https://api.github.com/repos/tachiyomiorg/tachiyomi-extensions-inspector/releases/latest" | jq -r '.assets[0].browser_download_url')" + curl -L "$INSPECTOR_LINK" -o ./Inspector.jar + java -jar ./Inspector.jar "apk" "output.json" "tmp" + ./.github/scripts/create-repo.sh + + - name: Checkout repo branch + uses: actions/checkout@v4 + with: + repository: keiyoushi/tachiyomi-extensions + token: ${{ secrets.BOT_PAT }} + ref: repo + path: repo + + - name: Deploy repo + run: | + cd repo + ../main/.github/scripts/commit-repo.sh diff --git a/.github/workflows/issue_moderator.yml b/.github/workflows/issue_moderator.yml new file mode 100644 index 000000000..ff50bbf2b --- /dev/null +++ b/.github/workflows/issue_moderator.yml @@ -0,0 +1,47 @@ +name: Issue moderator + +on: + issues: + types: [opened, edited, reopened] + issue_comment: + types: [created] + +jobs: + autoclose: + runs-on: ubuntu-latest + steps: + - name: Moderate issues + uses: tachiyomiorg/issue-moderator-action@v2 + with: + repo-token: ${{ secrets.GITHUB_TOKEN }} + duplicate-label: Duplicate + + duplicate-check-enabled: true + duplicate-check-labels: | + ["Source request", "Domain changed"] + + existing-check-enabled: true + existing-check-labels: | + ["Source request", "Domain changed"] + + auto-close-rules: | + [ + { + "type": "body", + "regex": ".*\\* (Tachiyomi version|Android version|Device): \\?.*", + "message": "Requested information in the template was not filled out." + }, + { + "type": "title", + "regex": ".*(Source name|Short description).*", + "message": "You did not fill out the description in the title." + }, + { + "type": "both", + "regex": ".*(?:fail(?:ed|ure|s)?|can\\s*(?:no|')?t|(?:not|un).*able|(?("clean") { + delete(rootProject.layout.buildDirectory.asFile.get()) +} diff --git a/buildSrc/build.gradle.kts b/buildSrc/build.gradle.kts new file mode 100644 index 000000000..876c922b2 --- /dev/null +++ b/buildSrc/build.gradle.kts @@ -0,0 +1,7 @@ +plugins { + `kotlin-dsl` +} + +repositories { + mavenCentral() +} diff --git a/buildSrc/src/main/kotlin/AndroidConfig.kt b/buildSrc/src/main/kotlin/AndroidConfig.kt new file mode 100644 index 000000000..ac6d1d01e --- /dev/null +++ b/buildSrc/src/main/kotlin/AndroidConfig.kt @@ -0,0 +1,6 @@ +object AndroidConfig { + const val compileSdk = 34 + const val minSdk = 21 + @Suppress("UNUSED") + const val targetSdk = 34 +} diff --git a/common.gradle b/common.gradle new file mode 100644 index 000000000..769166a92 --- /dev/null +++ b/common.gradle @@ -0,0 +1,105 @@ +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" + } + debug { + manifest.srcFile "AndroidManifest.xml" + } + } + + defaultConfig { + minSdkVersion AndroidConfig.minSdk + targetSdkVersion AndroidConfig.targetSdk + applicationIdSuffix pkgNameSuffix + versionCode extVersionCode + versionName project.ext.properties.getOrDefault("libVersion", "1.4") + ".$extVersionCode" + setProperty("archivesBaseName", "tachiyomi-$pkgNameSuffix-v$versionName") + def readmes = project.projectDir.listFiles({ File file -> + file.name == "README.md" || file.name == "CHANGELOG.md" + } as FileFilter) + def hasReadme = readmes != null && readmes.any { File file -> + file.name.startsWith("README") + } + def hasChangelog = readmes != null && readmes.any { File file -> + file.name.startsWith("CHANGELOG") + } + manifestPlaceholders = [ + appName : "Tachiyomi: $extName", + extClass: extClass, + extFactory: project.ext.properties.getOrDefault("extFactory", ""), + nsfw: project.ext.properties.getOrDefault("isNsfw", false) ? 1 : 0, + hasReadme: hasReadme ? 1 : 0, + hasChangelog: hasChangelog ? 1 : 0, + ] + } + + signingConfigs { + release { + storeFile rootProject.file("signingkey.jks") + storePassword System.getenv("KEY_STORE_PASSWORD") + keyAlias System.getenv("ALIAS") + keyPassword System.getenv("KEY_PASSWORD") + } + } + + buildTypes { + release { + signingConfig signingConfigs.release + minifyEnabled false + } + } + + dependenciesInfo { + includeInApk = false + } + + buildFeatures { + // Disable unused AGP features + aidl false + renderScript false + resValues false + shaders false + } + + compileOptions { + sourceCompatibility = JavaVersion.VERSION_1_8 + targetCompatibility = JavaVersion.VERSION_1_8 + } + + kotlinOptions { + jvmTarget = JavaVersion.VERSION_1_8.toString() + freeCompilerArgs += "-opt-in=kotlinx.serialization.ExperimentalSerializationApi" + } + + kotlinter { + experimentalRules = true + disabledRules = [ + "experimental:argument-list-wrapping", // Doesn't play well with Android Studio + "experimental:comment-wrapping", + ] + } +} + +repositories { + mavenCentral() +} + +dependencies { + implementation(project(":core")) + compileOnly(libs.bundles.common) +} + +preBuild.dependsOn(lintKotlin) +lintKotlin.dependsOn(formatKotlin) diff --git a/core/AndroidManifest.xml b/core/AndroidManifest.xml new file mode 100644 index 000000000..ed0e26f0d --- /dev/null +++ b/core/AndroidManifest.xml @@ -0,0 +1,16 @@ + + + + + + + + + + + + + + + + diff --git a/core/build.gradle.kts b/core/build.gradle.kts new file mode 100644 index 000000000..e3948945d --- /dev/null +++ b/core/build.gradle.kts @@ -0,0 +1,27 @@ +plugins { + id("com.android.library") +} + +android { + compileSdk = AndroidConfig.compileSdk + + defaultConfig { + minSdk = AndroidConfig.minSdk + } + + namespace = "eu.kanade.tachiyomi.extension" + + @Suppress("UnstableApiUsage") + sourceSets { + named("main") { + manifest.srcFile("AndroidManifest.xml") + res.setSrcDirs(listOf("res")) + } + } + + libraryVariants.all { + generateBuildConfigProvider?.configure { + enabled = false + } + } +} diff --git a/core/res/mipmap-hdpi/ic_launcher.png b/core/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..3e78412b0 Binary files /dev/null and b/core/res/mipmap-hdpi/ic_launcher.png differ diff --git a/core/res/mipmap-mdpi/ic_launcher.png b/core/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..88037fe19 Binary files /dev/null and b/core/res/mipmap-mdpi/ic_launcher.png differ diff --git a/core/res/mipmap-xhdpi/ic_launcher.png b/core/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..554324ed0 Binary files /dev/null and b/core/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/core/res/mipmap-xxhdpi/ic_launcher.png b/core/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..99590ff99 Binary files /dev/null and b/core/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/core/res/mipmap-xxxhdpi/ic_launcher.png b/core/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..9ddcbc028 Binary files /dev/null and b/core/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/gradle.properties b/gradle.properties new file mode 100644 index 000000000..a30adac64 --- /dev/null +++ b/gradle.properties @@ -0,0 +1,23 @@ +# Project-wide Gradle settings. + +# IDE (e.g. Android Studio) users: +# Gradle settings configured through the IDE *will override* +# any settings specified in this file. + +# For more details on how to configure your build environment visit +# http://www.gradle.org/docs/current/userguide/build_environment.html + +# Specifies the JVM arguments used for the daemon process. +# The setting is particularly useful for tweaking memory settings. +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 +# http://www.gradle.org/docs/current/userguide/multi_project_builds.html#sec:decoupled_projects +org.gradle.parallel=true +org.gradle.workers.max=5 + +org.gradle.caching=true + +# Enable AndroidX dependencies +android.useAndroidX=true diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml new file mode 100644 index 000000000..88100fa5c --- /dev/null +++ b/gradle/libs.versions.toml @@ -0,0 +1,28 @@ +[versions] +kotlin_version = "1.7.21" +coroutines_version = "1.6.4" +serialization_version = "1.4.0" + +[libraries] +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" } + +tachiyomi-lib = { module = "com.github.tachiyomiorg:extensions-lib", version = "1.4.2" } + +kotlin-stdlib = { module = "org.jetbrains.kotlin:kotlin-stdlib-jdk8", version.ref = "kotlin_version" } +kotlin-protobuf = { module = "org.jetbrains.kotlinx:kotlinx-serialization-protobuf", version.ref = "serialization_version" } +kotlin-json = { module = "org.jetbrains.kotlinx:kotlinx-serialization-json", version.ref = "serialization_version" } + +coroutines-core = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-core", version.ref = "coroutines_version" } +coroutines-android = { module = "org.jetbrains.kotlinx:kotlinx-coroutines-android", version.ref = "coroutines_version" } + +injekt-core = { module = "com.github.inorichi.injekt:injekt-core", version = "65b0440" } +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" } +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"] diff --git a/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar new file mode 100644 index 000000000..943f0cbfa Binary files /dev/null and b/gradle/wrapper/gradle-wrapper.jar differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties new file mode 100644 index 000000000..ac72c34e8 --- /dev/null +++ b/gradle/wrapper/gradle-wrapper.properties @@ -0,0 +1,7 @@ +distributionBase=GRADLE_USER_HOME +distributionPath=wrapper/dists +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 new file mode 100755 index 000000000..65dcd68d6 --- /dev/null +++ b/gradlew @@ -0,0 +1,244 @@ +#!/bin/sh + +# +# Copyright © 2015-2021 the original authors. +# +# Licensed under the Apache License, Version 2.0 (the "License"); +# you may not use this file except in compliance with the License. +# You may obtain a copy of the License at +# +# https://www.apache.org/licenses/LICENSE-2.0 +# +# Unless required by applicable law or agreed to in writing, software +# distributed under the License is distributed on an "AS IS" BASIS, +# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +# See the License for the specific language governing permissions and +# limitations under the License. +# + +############################################################################## +# +# Gradle start up script for POSIX generated by Gradle. +# +# Important for running: +# +# (1) You need a POSIX-compliant shell to run this script. If your /bin/sh is +# noncompliant, but you have some other compliant shell such as ksh or +# bash, then to run this script, type that shell name before the whole +# command line, like: +# +# ksh Gradle +# +# Busybox and similar reduced shells will NOT work, because this script +# requires all of these POSIX shell features: +# * functions; +# * expansions «$var», «${var}», «${var:-default}», «${var+SET}», +# «${var#prefix}», «${var%suffix}», and «$( cmd )»; +# * compound commands having a testable exit status, especially «case»; +# * various built-in commands including «command», «set», and «ulimit». +# +# Important for patching: +# +# (2) This script targets any POSIX shell, so it avoids extensions provided +# by Bash, Ksh, etc; in particular arrays are avoided. +# +# The "traditional" practice of packing multiple parameters into a +# space-separated string is a well documented source of bugs and security +# problems, so this is (mostly) avoided, by progressively accumulating +# options in "$@", and eventually passing that to Java. +# +# Where the inherited environment variables (DEFAULT_JVM_OPTS, JAVA_OPTS, +# and GRADLE_OPTS) rely on word-splitting, this is performed explicitly; +# see the in-line comments for details. +# +# There are tweaks for specific operating systems such as AIX, CygWin, +# Darwin, MinGW, and NonStop. +# +# (3) This script is generated from the Groovy template +# 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/. +# +############################################################################## + +# Attempt to set APP_HOME + +# Resolve links: $0 may be a link +app_path=$0 + +# Need this for daisy-chained symlinks. +while + APP_HOME=${app_path%"${app_path##*/}"} # leaves a trailing /; empty if no leading path + [ -h "$app_path" ] +do + ls=$( ls -ld "$app_path" ) + link=${ls#*' -> '} + case $link in #( + /*) app_path=$link ;; #( + *) app_path=$APP_HOME$link ;; + esac +done + +# 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"' + +# Use the maximum available, or set MAX_FD != -1 to use that value. +MAX_FD=maximum + +warn () { + echo "$*" +} >&2 + +die () { + echo + echo "$*" + echo + exit 1 +} >&2 + +# OS specific support (must be 'true' or 'false'). +cygwin=false +msys=false +darwin=false +nonstop=false +case "$( uname )" in #( + CYGWIN* ) cygwin=true ;; #( + Darwin* ) darwin=true ;; #( + MSYS* | MINGW* ) msys=true ;; #( + NONSTOP* ) nonstop=true ;; +esac + +CLASSPATH=$APP_HOME/gradle/wrapper/gradle-wrapper.jar + + +# Determine the Java command to use to start the JVM. +if [ -n "$JAVA_HOME" ] ; then + if [ -x "$JAVA_HOME/jre/sh/java" ] ; then + # IBM's JDK on AIX uses strange locations for the executables + JAVACMD=$JAVA_HOME/jre/sh/java + else + JAVACMD=$JAVA_HOME/bin/java + fi + if [ ! -x "$JAVACMD" ] ; then + die "ERROR: JAVA_HOME is set to an invalid directory: $JAVA_HOME + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." + fi +else + JAVACMD=java + which java >/dev/null 2>&1 || die "ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. + +Please set the JAVA_HOME variable in your environment to match the +location of your Java installation." +fi + +# Increase the maximum file descriptors if we can. +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 +fi + +# Collect all arguments for the java command, stacking in reverse order: +# * args from the command line +# * the main class name +# * -classpath +# * -D...appname settings +# * --module-path (only if needed) +# * DEFAULT_JVM_OPTS, JAVA_OPTS, and GRADLE_OPTS environment variables. + +# For Cygwin or MSYS, switch paths to Windows format before running java +if "$cygwin" || "$msys" ; then + APP_HOME=$( cygpath --path --mixed "$APP_HOME" ) + CLASSPATH=$( cygpath --path --mixed "$CLASSPATH" ) + + JAVACMD=$( cygpath --unix "$JAVACMD" ) + + # Now convert the arguments - kludge to limit ourselves to /bin/sh + for arg do + if + case $arg in #( + -*) false ;; # don't mess with options #( + /?*) t=${arg#/} t=/${t%%/*} # looks like a POSIX filepath + [ -e "$t" ] ;; #( + *) false ;; + esac + then + arg=$( cygpath --path --ignore --mixed "$arg" ) + fi + # Roll the args list around exactly as many times as the number of + # args, so each arg winds up back in the position where it started, but + # possibly modified. + # + # NB: a `for` loop captures its iteration list before it begins, so + # changing the positional parameters here affects neither the number of + # iterations, nor the values presented in `arg`. + shift # remove old arg + set -- "$@" "$arg" # push replacement arg + done +fi + +# Collect all arguments for the java command; +# * $DEFAULT_JVM_OPTS, $JAVA_OPTS, and $GRADLE_OPTS can contain fragments of +# shell script including quotes and variable substitutions, so put them in +# double quotes to make sure that they get re-expanded; and +# * put everything else in single quotes, so that it's not re-expanded. + +set -- \ + "-Dorg.gradle.appname=$APP_BASE_NAME" \ + -classpath "$CLASSPATH" \ + 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. +# +# In Bash we could simply go: +# +# readarray ARGS < <( xargs -n1 <<<"$var" ) && +# set -- "${ARGS[@]}" "$@" +# +# but POSIX shell has neither arrays nor command substitution, so instead we +# post-process each arg (as a line of input to sed) to backslash-escape any +# character that might be a shell metacharacter, then use eval to reverse +# that process (while maintaining the separation between arguments), and wrap +# the whole thing up as a single "set" statement. +# +# This will of course break if any of these variables contains a newline or +# an unmatched quote. +# + +eval "set -- $( + printf '%s\n' "$DEFAULT_JVM_OPTS $JAVA_OPTS $GRADLE_OPTS" | + xargs -n1 | + sed ' s~[^-[:alnum:]+,./:=@_]~\\&~g; ' | + tr '\n' ' ' + )" '"$@"' + +exec "$JAVACMD" "$@" diff --git a/gradlew.bat b/gradlew.bat new file mode 100644 index 000000000..93e3f59f1 --- /dev/null +++ b/gradlew.bat @@ -0,0 +1,92 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME% + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\gradle\wrapper\gradle-wrapper.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.wrapper.GradleWrapperMain %* + +:end +@rem End local scope for the variables with windows NT shell +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! +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 + +:omega diff --git a/ktlintCodeStyle.xml b/ktlintCodeStyle.xml new file mode 100644 index 000000000..e1422c7c8 --- /dev/null +++ b/ktlintCodeStyle.xml @@ -0,0 +1,136 @@ + + + + + + + + + +
+ + + + xmlns:android + + ^$ + + + +
+
+ + + + xmlns:.* + + ^$ + + + BY_NAME + +
+
+ + + + .*:id + + http://schemas.android.com/apk/res/android + + + +
+
+ + + + .*:name + + http://schemas.android.com/apk/res/android + + + +
+
+ + + + name + + ^$ + + + +
+
+ + + + style + + ^$ + + + +
+
+ + + + .* + + ^$ + + + BY_NAME + +
+
+ + + + .* + + http://schemas.android.com/apk/res/android + + + ANDROID_ATTRIBUTE_ORDER + +
+
+ + + + .* + + .* + + + BY_NAME + +
+
+
+
+ + +
\ No newline at end of file diff --git a/lib/cryptoaes/build.gradle.kts b/lib/cryptoaes/build.gradle.kts new file mode 100644 index 000000000..a9c8a57c6 --- /dev/null +++ b/lib/cryptoaes/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.cryptoaes" +} + +repositories { + mavenCentral() +} + +dependencies { + compileOnly(libs.kotlin.stdlib) +} 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 new file mode 100644 index 000000000..43594c247 --- /dev/null +++ b/lib/cryptoaes/src/main/java/eu/kanade/tachiyomi/lib/cryptoaes/CryptoAES.kt @@ -0,0 +1,133 @@ +package eu.kanade.tachiyomi.lib.cryptoaes +// Thanks to Vlad on Stackoverflow: https://stackoverflow.com/a/63701411 + +import android.util.Base64 +import java.security.MessageDigest +import java.util.Arrays +import javax.crypto.Cipher +import javax.crypto.spec.IvParameterSpec +import javax.crypto.spec.SecretKeySpec + +/** + * Conforming with CryptoJS AES method + */ +object CryptoAES { + + private const val KEY_SIZE = 256 + private const val IV_SIZE = 128 + private const val HASH_CIPHER = "AES/CBC/PKCS7PADDING" + private const val AES = "AES" + private const val KDF_DIGEST = "MD5" + + /** + * Decrypt using CryptoJS defaults compatible method. + * Uses KDF equivalent to OpenSSL's EVP_BytesToKey function + * + * http://stackoverflow.com/a/29152379/4405051 + * @param cipherText base64 encoded ciphertext + * @param password passphrase + */ + fun decrypt(cipherText: String, password: String): String { + 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) + decryptAES(cipherTextBytes, + keyAndIV?.get(0) ?: ByteArray(32), + keyAndIV?.get(1) ?: ByteArray(16)) + } catch (e: Exception) { + "" + } + } + + /** + * Decrypt using CryptoJS defaults compatible method. + * + * @param cipherText base64 encoded ciphertext + * @param keyBytes key as a bytearray + * @param ivBytes iv as a bytearray + */ + fun decrypt(cipherText: String, keyBytes: ByteArray, ivBytes: ByteArray): String { + return try { + val cipherTextBytes = Base64.decode(cipherText, Base64.DEFAULT) + decryptAES(cipherTextBytes, keyBytes, ivBytes) + } catch (e: Exception) { + "" + } + } + + /** + * Decrypt using CryptoJS defaults compatible method. + * + * @param cipherTextBytes encrypted text as a bytearray + * @param keyBytes key as a bytearray + * @param ivBytes iv as a bytearray + */ + private fun decryptAES(cipherTextBytes: ByteArray, keyBytes: ByteArray, ivBytes: ByteArray): String { + return try { + val cipher = Cipher.getInstance(HASH_CIPHER) + val keyS = SecretKeySpec(keyBytes, AES) + cipher.init(Cipher.DECRYPT_MODE, keyS, IvParameterSpec(ivBytes)) + cipher.doFinal(cipherTextBytes).toString(Charsets.UTF_8) + } catch (e: Exception) { + "" + } + } + + /** + * Generates a key and an initialization vector (IV) with the given salt and password. + * + * https://stackoverflow.com/a/41434590 + * This method is equivalent to OpenSSL's EVP_BytesToKey function + * (see https://github.com/openssl/openssl/blob/master/crypto/evp/evp_key.c). + * By default, OpenSSL uses a single iteration, MD5 as the algorithm and UTF-8 encoded password data. + * + * @param keyLength the length of the generated key (in bytes) + * @param ivLength the length of the generated IV (in bytes) + * @param iterations the number of digestion rounds + * @param salt the salt data (8 bytes of data or `null`) + * @param password the password data (optional) + * @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 + val generatedData = ByteArray(requiredLength) + var generatedLength = 0 + return try { + md.reset() + + // Repeat process until sufficient data has been generated + while (generatedLength < keyLength + ivLength) { + + // Digest data (last digest if available, password data, salt if available) + if (generatedLength > 0) md.update(generatedData, generatedLength - digestLength, digestLength) + md.update(password) + md.update(salt, 0, 8) + md.digest(generatedData, generatedLength, digestLength) + + // additional rounds + for (i in 1 until iterations) { + md.update(generatedData, generatedLength, digestLength) + md.digest(generatedData, generatedLength, digestLength) + } + generatedLength += digestLength + } + + // Copy key and IV into separate byte arrays + val result = arrayOfNulls(2) + result[0] = generatedData.copyOfRange(0, keyLength) + if (ivLength > 0) result[1] = generatedData.copyOfRange(keyLength, keyLength + ivLength) + result + } catch (e: Exception) { + throw e + } finally { + // Clean out temporary data + Arrays.fill(generatedData, 0.toByte()) + } + } +} 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 new file mode 100644 index 000000000..70f1c4227 --- /dev/null +++ b/lib/cryptoaes/src/main/java/eu/kanade/tachiyomi/lib/cryptoaes/Deobfuscator.kt @@ -0,0 +1,73 @@ +package eu.kanade.tachiyomi.lib.cryptoaes +/** + * Helper class to deobfuscate JavaScript strings encoded in JSFuck style. + * + * More info on JSFuck found [here](https://en.wikipedia.org/wiki/JSFuck). + * + * Currently only supports Numeric and decimal ('.') characters + */ +object Deobfuscator { + fun deobfuscateJsPassword(inputString: String): String { + var idx = 0 + val brackets = listOf('[', '(') + val evaluatedString = StringBuilder() + while (idx < inputString.length) { + val chr = inputString[idx] + if (chr !in brackets) { + idx++ + continue + } + val closingIndex = getMatchingBracketIndex(idx, inputString) + if (chr == '[') { + val digit = calculateDigit(inputString.substring(idx, closingIndex)) + evaluatedString.append(digit) + } else { + evaluatedString.append('.') + if (inputString.getOrNull(closingIndex + 1) == '[') { + val skippingIndex = getMatchingBracketIndex(closingIndex + 1, inputString) + idx = skippingIndex + 1 + continue + } + } + idx = closingIndex + 1 + } + return evaluatedString.toString() + } + + private fun getMatchingBracketIndex(openingIndex: Int, inputString: String): Int { + val openingBracket = inputString[openingIndex] + val closingBracket = when (openingBracket) { + '[' -> ']' + else -> ')' + } + var counter = 0 + for (idx in openingIndex until inputString.length) { + if (inputString[idx] == openingBracket) counter++ + if (inputString[idx] == closingBracket) counter-- + + if (counter == 0) return idx // found matching bracket + if (counter < 0) return -1 // unbalanced brackets + } + return -1 // matching bracket not found + } + + private fun calculateDigit(inputSubString: String): Char { + /* 0 == '+[]' + 1 == '+!+[]' + 2 == '!+[]+!+[]' + 3 == '!+[]+!+[]+!+[]' + ... + therefore '!+[]' count equals the digit + if count equals 0, check for '+[]' just to be sure + */ + val digit = "!\\+\\[]".toRegex().findAll(inputSubString).count() // matches '!+[]' + if (digit == 0) { + if ("\\+\\[]".toRegex().findAll(inputSubString).count() == 1) { // matches '+[]' + return '0' + } + } else if (digit in 1..9) { + return digit.digitToChar() + } + return '-' // Illegal digit + } +} diff --git a/lib/dataimage/build.gradle.kts b/lib/dataimage/build.gradle.kts new file mode 100644 index 000000000..eebbf7808 --- /dev/null +++ b/lib/dataimage/build.gradle.kts @@ -0,0 +1,24 @@ +plugins { + id("com.android.library") + kotlin("android") +} + +android { + compileSdk = AndroidConfig.compileSdk + + defaultConfig { + minSdk = AndroidConfig.minSdk + } + + namespace = "eu.kanade.tachiyomi.lib.dataimage" +} + +repositories { + mavenCentral() +} + +dependencies { + compileOnly(libs.kotlin.stdlib) + compileOnly(libs.okhttp) + compileOnly(libs.jsoup) +} diff --git a/lib/dataimage/src/main/java/eu/kanade/tachiyomi/lib/dataimage/DataImageInterceptor.kt b/lib/dataimage/src/main/java/eu/kanade/tachiyomi/lib/dataimage/DataImageInterceptor.kt new file mode 100644 index 000000000..3599a8910 --- /dev/null +++ b/lib/dataimage/src/main/java/eu/kanade/tachiyomi/lib/dataimage/DataImageInterceptor.kt @@ -0,0 +1,65 @@ +package eu.kanade.tachiyomi.lib.dataimage + +import android.util.Base64 +import okhttp3.Interceptor +import okhttp3.MediaType.Companion.toMediaTypeOrNull +import okhttp3.Protocol +import okhttp3.Response +import okhttp3.ResponseBody.Companion.toResponseBody +import org.jsoup.nodes.Element + +/** + * If a source provides images via a data:image string instead of a URL, use these functions and interceptor + */ + +/** + * Use if the attribute tag could have a data:image string or URL + * Transforms data:image in to a fake URL that OkHttp won't die on + */ +fun Element.dataImageAsUrl(attr: String): String { + return if (this.attr(attr).startsWith("data")) { + "https://127.0.0.1/?" + this.attr(attr).substringAfter(":") + } else { + this.attr("abs:$attr") + } +} + +/** + * Use if the attribute tag has a data:image string but real URLs are on a different attribute + */ +fun Element.dataImageAsUrlOrNull(attr: String): String? { + return if (this.attr(attr).startsWith("data")) { + "https://127.0.0.1/?" + this.attr(attr).substringAfter(":") + } else { + null + } +} + +/** + * Interceptor that detects the URLs we created with the above functions, base64 decodes the data if necessary, + * and builds a response with a valid image that Tachiyomi can display + */ +class DataImageInterceptor : Interceptor { + private val mediaTypePattern = Regex("""(^[^;,]*)[;,]""") + + override fun intercept(chain: Interceptor.Chain): Response { + val url = chain.request().url.toString() + return if (url.startsWith("https://127.0.0.1/?image")) { + val dataString = url.substringAfter("?") + val byteArray = if (dataString.contains("base64")) { + Base64.decode(dataString.substringAfter("base64,"), Base64.DEFAULT) + } else { + dataString.substringAfter(",").toByteArray() + } + val mediaType = mediaTypePattern.find(dataString)!!.value.toMediaTypeOrNull() + Response.Builder().body(byteArray.toResponseBody(mediaType)) + .request(chain.request()) + .protocol(Protocol.HTTP_1_0) + .code(200) + .message("") + .build() + } else { + chain.proceed(chain.request()) + } + } +} diff --git a/lib/i18n/build.gradle.kts b/lib/i18n/build.gradle.kts new file mode 100644 index 000000000..f21bb7314 --- /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 000000000..cdb02f5ff --- /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 000000000..36ef0d678 --- /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 000000000..0d36add8a --- /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 000000000..a92e67fa9 --- /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 new file mode 100644 index 000000000..c178641a2 --- /dev/null +++ b/lib/synchrony/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.synchrony" +} + +repositories { + mavenCentral() +} + +dependencies { + compileOnly(libs.bundles.common) +} 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 new file mode 100644 index 000000000..f85a43cdf --- /dev/null +++ b/lib/synchrony/src/main/java/eu/kanade/tachiyomi/lib/synchrony/Deobfuscator.kt @@ -0,0 +1,42 @@ +package eu.kanade.tachiyomi.lib.synchrony + +import app.cash.quickjs.QuickJs + +/** + * Helper class to deobfuscate JavaScript strings with synchrony. + */ +object Deobfuscator { + fun deobfuscateScript(source: String): String? { + val originalScript = javaClass.getResource("/assets/$SCRIPT_NAME") + ?.readText() ?: return null + + // Sadly needed until QuickJS properly supports module imports: + // Regex for finding one and two in "export{one as Deobfuscator,two as Transformer};" + val regex = """export\{(.*) as Deobfuscator,(.*) as Transformer\};""".toRegex() + val synchronyScript = regex.find(originalScript)?.let { match -> + val (deob, trans) = match.destructured + val replacement = "const Deobfuscator = $deob, Transformer = $trans;" + originalScript.replace(match.value, replacement) + } ?: return null + + return QuickJs.create().use { engine -> + engine.evaluate("globalThis.console = { log: () => {}, warn: () => {}, error: () => {}, trace: () => {} };") + engine.evaluate(synchronyScript) + + engine.set( + "source", TestInterface::class.java, + object : TestInterface { + override fun getValue() = source + }, + ) + engine.evaluate("new Deobfuscator().deobfuscateSource(source.getValue())") as? String + } + } + + private interface TestInterface { + fun getValue(): String + } +} + +// Update this when the script is updated! +private const val SCRIPT_NAME = "synchrony-v2.4.2.1.js" diff --git a/lib/textinterceptor/build.gradle.kts b/lib/textinterceptor/build.gradle.kts new file mode 100644 index 000000000..f7102a8a4 --- /dev/null +++ b/lib/textinterceptor/build.gradle.kts @@ -0,0 +1,23 @@ +plugins { + id("com.android.library") + kotlin("android") +} + +android { + compileSdk = AndroidConfig.compileSdk + + defaultConfig { + minSdk = AndroidConfig.minSdk + } + + namespace = "eu.kanade.tachiyomi.lib.textinterceptor" +} + +repositories { + mavenCentral() +} + +dependencies { + compileOnly(libs.kotlin.stdlib) + compileOnly(libs.okhttp) +} 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 new file mode 100644 index 000000000..d1b6fd98f --- /dev/null +++ b/lib/textinterceptor/src/main/java/eu/kanade/tachiyomi/lib/textinterceptor/TextInterceptor.kt @@ -0,0 +1,125 @@ +package eu.kanade.tachiyomi.lib.textinterceptor + +import android.annotation.SuppressLint +import android.graphics.Bitmap +import android.graphics.Canvas +import android.graphics.Color +import android.graphics.Typeface +import android.net.Uri +import android.os.Build +import android.text.Html +import android.text.Layout +import android.text.StaticLayout +import android.text.TextPaint +import okhttp3.Interceptor +import okhttp3.MediaType.Companion.toMediaType +import okhttp3.Protocol +import okhttp3.Response +import okhttp3.ResponseBody.Companion.toResponseBody +import java.io.ByteArrayOutputStream + +class TextInterceptor : Interceptor { + // With help from: + // https://github.com/tachiyomiorg/tachiyomi-extensions/pull/13304#issuecomment-1234532897 + // https://medium.com/over-engineering/drawing-multiline-text-to-canvas-on-android-9b98f0bfa16a + + companion object { + // Designer values: + private const val WIDTH: Int = 1000 + private const val X_PADDING: Float = 50f + private const val Y_PADDING: Float = 25f + private const val HEADING_FONT_SIZE: Float = 36f + private const val BODY_FONT_SIZE: Float = 30f + private const val SPACING_MULT: Float = 1.1f + private const val SPACING_ADD: Float = 2f + + // No need to touch this one: + private const val HOST = TextInterceptorHelper.HOST + } + + override fun intercept(chain: Interceptor.Chain): Response { + val request = chain.request() + val url = request.url + if (url.host != HOST) return chain.proceed(request) + + val creator = textFixer("Author's Notes from ${url.pathSegments[0]}") + val story = textFixer(url.pathSegments[1]) + + // Heading + val paintHeading = TextPaint().apply { + color = Color.BLACK + textSize = HEADING_FONT_SIZE + typeface = Typeface.DEFAULT_BOLD + isAntiAlias = true + } + + @Suppress("DEPRECATION") + val heading = StaticLayout( + creator, paintHeading, (WIDTH - 2 * X_PADDING).toInt(), + Layout.Alignment.ALIGN_NORMAL, SPACING_MULT, SPACING_ADD, true + ) + + // Body + val paintBody = TextPaint().apply { + color = Color.BLACK + textSize = BODY_FONT_SIZE + typeface = Typeface.DEFAULT + isAntiAlias = true + } + + @Suppress("DEPRECATION") + val body = StaticLayout( + story, paintBody, (WIDTH - 2 * X_PADDING).toInt(), + Layout.Alignment.ALIGN_NORMAL, SPACING_MULT, SPACING_ADD, true + ) + + // Image building + val imgHeight: Int = (heading.height + body.height + 2 * Y_PADDING).toInt() + val bitmap: Bitmap = Bitmap.createBitmap(WIDTH, imgHeight, Bitmap.Config.ARGB_8888) + + 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() + bitmap.compress(Bitmap.CompressFormat.PNG, 0, stream) + val responseBody = stream.toByteArray().toResponseBody("image/png".toMediaType()) + return Response.Builder() + .request(request) + .protocol(Protocol.HTTP_1_1) + .code(200) + .message("OK") + .body(responseBody) + .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) + this.draw(canvas) + canvas.restore() + } +} + +object TextInterceptorHelper { + + const val HOST = "tachiyomi-lib-textinterceptor" + + fun createUrl(creator: String, text: String): String { + return "http://$HOST/" + Uri.encode(creator) + "/" + Uri.encode(text) + } +} diff --git a/lib/unpacker/build.gradle.kts b/lib/unpacker/build.gradle.kts new file mode 100644 index 000000000..3aa58a627 --- /dev/null +++ b/lib/unpacker/build.gradle.kts @@ -0,0 +1,12 @@ +plugins { + `java-library` + kotlin("jvm") +} + +repositories { + mavenCentral() +} + +dependencies { + compileOnly(libs.kotlin.stdlib) +} diff --git a/lib/unpacker/src/main/java/eu/kanade/tachiyomi/lib/unpacker/SubstringExtractor.kt b/lib/unpacker/src/main/java/eu/kanade/tachiyomi/lib/unpacker/SubstringExtractor.kt new file mode 100644 index 000000000..a5f43e017 --- /dev/null +++ b/lib/unpacker/src/main/java/eu/kanade/tachiyomi/lib/unpacker/SubstringExtractor.kt @@ -0,0 +1,34 @@ +package eu.kanade.tachiyomi.lib.unpacker + +/** + * A helper class to extract substrings efficiently. + * + * Note that all methods move [startIndex] over the ending delimiter. + */ +class SubstringExtractor(private val text: String) { + private var startIndex = 0 + + fun skipOver(str: String) { + val index = text.indexOf(str, startIndex) + if (index == -1) return + startIndex = index + str.length + } + + fun substringBefore(str: String): String { + val index = text.indexOf(str, startIndex) + if (index == -1) return "" + val result = text.substring(startIndex, index) + startIndex = index + str.length + return result + } + + fun substringBetween(left: String, right: String): String { + val index = text.indexOf(left, startIndex) + if (index == -1) return "" + val leftIndex = index + left.length + val rightIndex = text.indexOf(right, leftIndex) + if (rightIndex == -1) return "" + startIndex = rightIndex + right.length + return text.substring(leftIndex, rightIndex) + } +} diff --git a/lib/unpacker/src/main/java/eu/kanade/tachiyomi/lib/unpacker/Unpacker.kt b/lib/unpacker/src/main/java/eu/kanade/tachiyomi/lib/unpacker/Unpacker.kt new file mode 100644 index 000000000..1c4b5bd6c --- /dev/null +++ b/lib/unpacker/src/main/java/eu/kanade/tachiyomi/lib/unpacker/Unpacker.kt @@ -0,0 +1,76 @@ +package eu.kanade.tachiyomi.lib.unpacker + +/** + * Helper class to unpack JavaScript code compressed by [packer](http://dean.edwards.name/packer/). + * + * Source code of packer can be found [here](https://github.com/evanw/packer/blob/master/packer.js). + */ +object Unpacker { + + /** + * Unpacks JavaScript code compressed by packer. + * + * Specify [left] and [right] to unpack only the data between them. + * + * Note: single quotes `\'` in the data will be replaced with double quotes `"`. + */ + fun unpack(script: String, left: String? = null, right: String? = null): String = + unpack(SubstringExtractor(script), left, right) + + /** + * Unpacks JavaScript code compressed by packer. + * + * Specify [left] and [right] to unpack only the data between them. + * + * Note: single quotes `\'` in the data will be replaced with double quotes `"`. + */ + fun unpack(script: SubstringExtractor, left: String? = null, right: String? = null): String { + val packed = script + .substringBetween("}('", ".split('|'),0,{}))") + .replace("\\'", "\"") + + val parser = SubstringExtractor(packed) + val data: String + if (left != null && right != null) { + data = parser.substringBetween(left, right) + parser.skipOver("',") + } else { + data = parser.substringBefore("',") + } + if (data.isEmpty()) return "" + + val dictionary = parser.substringBetween("'", "'").split("|") + val size = dictionary.size + + return wordRegex.replace(data) { + val key = it.value + val index = parseRadix62(key) + if (index >= size) return@replace key + dictionary[index].ifEmpty { key } + } + } + + private val wordRegex by lazy { Regex("""\w+""") } + + private fun parseRadix62(str: String): Int { + var result = 0 + for (ch in str.toCharArray()) { + result = result * 62 + when { + ch.code <= '9'.code -> { // 0-9 + ch.code - '0'.code + } + + ch.code >= 'a'.code -> { // a-z + // ch - 'a' + 10 + ch.code - ('a'.code - 10) + } + + else -> { // A-Z + // ch - 'A' + 36 + ch.code - ('A'.code - 36) + } + } + } + return result + } +} diff --git a/multisrc/build.gradle.kts b/multisrc/build.gradle.kts new file mode 100644 index 000000000..7b2948f27 --- /dev/null +++ b/multisrc/build.gradle.kts @@ -0,0 +1,78 @@ +plugins { + id("com.android.library") + kotlin("android") + id("kotlinx-serialization") +} + +android { + compileSdk = AndroidConfig.compileSdk + + defaultConfig { + minSdk = 29 + } + + namespace = "eu.kanade.tachiyomi.lib.themesources" + + kotlinOptions { + freeCompilerArgs += "-opt-in=kotlinx.serialization.ExperimentalSerializationApi" + } +} + +repositories { + mavenCentral() +} + +configurations { + compileOnly { + isCanBeResolved = true + } +} + +dependencies { + compileOnly(libs.bundles.common) + + // Implements all :lib libraries on the multisrc generator + // Note that this does not mean that generated sources are going to + // implement them too; this is just to be able to compile and generate sources. + rootProject.subprojects + .filter { it.path.startsWith(":lib") } + .forEach(::implementation) +} + +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 + mainClass.set("generator.GeneratorMainKt") + + workingDir = workingDir.parentFile // project root + + errorOutput = System.out // for GitHub workflow commands + + if (!logger.isInfoEnabled) { + standardOutput = org.gradle.internal.io.NullOutputStream.INSTANCE + } + + dependsOn("ktLint", "assembleDebug") + } + + register("ktLint") { + if (project.hasProperty("theme")) { + val theme = project.property("theme") + source(files("src/main/java/eu/kanade/tachiyomi/multisrc/$theme", "overrides/$theme")) + return@register + } + source(files("src", "overrides")) + } + + register("ktFormat") { + if (project.hasProperty("theme")) { + val theme = project.property("theme") + source(files("src/main/java/eu/kanade/tachiyomi/multisrc/$theme", "overrides/$theme")) + return@register + } + source(files("src", "overrides")) + } +} diff --git a/multisrc/overrides/a3manga/a3manga/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/a3manga/a3manga/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..c232b90b3 Binary files /dev/null and b/multisrc/overrides/a3manga/a3manga/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/a3manga/a3manga/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/a3manga/a3manga/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..c5422b58d Binary files /dev/null and b/multisrc/overrides/a3manga/a3manga/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/a3manga/a3manga/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/a3manga/a3manga/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..720e67f3d Binary files /dev/null and b/multisrc/overrides/a3manga/a3manga/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/a3manga/a3manga/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/a3manga/a3manga/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..bf3ce20a6 Binary files /dev/null and b/multisrc/overrides/a3manga/a3manga/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/a3manga/a3manga/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/a3manga/a3manga/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..be7125539 Binary files /dev/null and b/multisrc/overrides/a3manga/a3manga/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/a3manga/default/AndroidManifest.xml b/multisrc/overrides/a3manga/default/AndroidManifest.xml new file mode 100644 index 000000000..196677396 --- /dev/null +++ b/multisrc/overrides/a3manga/default/AndroidManifest.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + + + diff --git a/multisrc/overrides/a3manga/ngonphong/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/a3manga/ngonphong/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..0c6c219ff Binary files /dev/null and b/multisrc/overrides/a3manga/ngonphong/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/a3manga/ngonphong/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/a3manga/ngonphong/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..1626ab78e Binary files /dev/null and b/multisrc/overrides/a3manga/ngonphong/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/a3manga/ngonphong/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/a3manga/ngonphong/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..e897210d4 Binary files /dev/null and b/multisrc/overrides/a3manga/ngonphong/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/a3manga/ngonphong/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/a3manga/ngonphong/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..8100eda75 Binary files /dev/null and b/multisrc/overrides/a3manga/ngonphong/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/a3manga/ngonphong/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/a3manga/ngonphong/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..d5e88a2ac Binary files /dev/null and b/multisrc/overrides/a3manga/ngonphong/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/a3manga/ngonphong/src/NgonPhong.kt b/multisrc/overrides/a3manga/ngonphong/src/NgonPhong.kt new file mode 100644 index 000000000..6c9afbd0d --- /dev/null +++ b/multisrc/overrides/a3manga/ngonphong/src/NgonPhong.kt @@ -0,0 +1,7 @@ +package eu.kanade.tachiyomi.extension.vi.ngonphong + +import eu.kanade.tachiyomi.multisrc.a3manga.A3Manga + +class NgonPhong : A3Manga("Ngôn Phong", "https://www.ngonphong.com", "vi") { + override val id: Long = 7268977637085631557 +} diff --git a/multisrc/overrides/a3manga/ocumeo/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/a3manga/ocumeo/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..64de658f5 Binary files /dev/null and b/multisrc/overrides/a3manga/ocumeo/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/a3manga/ocumeo/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/a3manga/ocumeo/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..a50fbf960 Binary files /dev/null and b/multisrc/overrides/a3manga/ocumeo/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/a3manga/ocumeo/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/a3manga/ocumeo/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..062e4bf96 Binary files /dev/null and b/multisrc/overrides/a3manga/ocumeo/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/a3manga/ocumeo/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/a3manga/ocumeo/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..e180f6f6e Binary files /dev/null and b/multisrc/overrides/a3manga/ocumeo/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/a3manga/ocumeo/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/a3manga/ocumeo/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..dec6ff00c Binary files /dev/null and b/multisrc/overrides/a3manga/ocumeo/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/a3manga/teamlanhlung/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/a3manga/teamlanhlung/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..e1d509058 Binary files /dev/null and b/multisrc/overrides/a3manga/teamlanhlung/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/a3manga/teamlanhlung/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/a3manga/teamlanhlung/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..c7411cfca Binary files /dev/null and b/multisrc/overrides/a3manga/teamlanhlung/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/a3manga/teamlanhlung/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/a3manga/teamlanhlung/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..a123f228c Binary files /dev/null and b/multisrc/overrides/a3manga/teamlanhlung/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/a3manga/teamlanhlung/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/a3manga/teamlanhlung/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..b507ebb5d Binary files /dev/null and b/multisrc/overrides/a3manga/teamlanhlung/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/a3manga/teamlanhlung/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/a3manga/teamlanhlung/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..70102554b Binary files /dev/null and b/multisrc/overrides/a3manga/teamlanhlung/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/bakamanga/manhwaxxl/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/bakamanga/manhwaxxl/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..32ea9d10c Binary files /dev/null and b/multisrc/overrides/bakamanga/manhwaxxl/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/bakamanga/manhwaxxl/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/bakamanga/manhwaxxl/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..a1e4fcd71 Binary files /dev/null and b/multisrc/overrides/bakamanga/manhwaxxl/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/bakamanga/manhwaxxl/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/bakamanga/manhwaxxl/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..b6d29fc5b Binary files /dev/null and b/multisrc/overrides/bakamanga/manhwaxxl/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/bakamanga/manhwaxxl/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/bakamanga/manhwaxxl/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..3e545a58d Binary files /dev/null and b/multisrc/overrides/bakamanga/manhwaxxl/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/bakamanga/manhwaxxl/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/bakamanga/manhwaxxl/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..1c53e9207 Binary files /dev/null and b/multisrc/overrides/bakamanga/manhwaxxl/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/bakamanga/manhwaxxl/src/ManhwaXXL.kt b/multisrc/overrides/bakamanga/manhwaxxl/src/ManhwaXXL.kt new file mode 100644 index 000000000..ba65d8f4f --- /dev/null +++ b/multisrc/overrides/bakamanga/manhwaxxl/src/ManhwaXXL.kt @@ -0,0 +1,68 @@ +package eu.kanade.tachiyomi.extension.en.manhwaxxl + +import eu.kanade.tachiyomi.multisrc.bakamanga.BakaManga + +class ManhwaXXL : BakaManga( + "Manhwa XXL", + "https://manhwaxxl.com", + "en", +) { + override fun getGenreList() = arrayOf( + Pair("All", ""), + Pair("Action", "action"), + Pair("Adaptation", "adaptation"), + Pair("Adult", "adult"), + Pair("Adventure", "adventure"), + Pair("BL", "bl"), + Pair("Comedy", "comedy"), + Pair("Cooking", "cooking"), + Pair("Demons", "demons"), + Pair("Drama", "drama"), + Pair("Ecchi", "ecchi"), + Pair("Fantasy", "fantasy"), + Pair("Full color", "full-color"), + Pair("Game", "game"), + Pair("Gender Bender", "gender-bender"), + Pair("GL", "gl"), + Pair("Harem", "harem"), + Pair("Historical", "historical"), + Pair("Horror", "horror"), + Pair("Isekai", "isekai"), + Pair("Josei", "josei"), + Pair("Live action", "live-action"), + Pair("Love & Romance", "love-romance"), + Pair("Magic", "magic"), + Pair("Manga", "manga"), + Pair("Manhua", "manhua"), + Pair("Manhwa", "manhwa"), + Pair("Martial Arts", "martial-arts"), + Pair("Mature", "mature"), + Pair("Mecha", "mecha"), + Pair("Mystery", "mystery"), + Pair("Omegaverse", "omegaverse"), + Pair("Psychological", "psychological"), + Pair("Raw", "raw"), + Pair("Reincarnation", "reincarnation"), + Pair("Romance", "romance"), + Pair("RPG", "rpg"), + Pair("School Life", "school-life"), + Pair("Sci-fi", "sci-fi"), + Pair("Seinen", "seinen"), + Pair("Shoujo", "shoujo"), + Pair("Shoujo Ai", "shoujo-ai"), + Pair("Shounen", "shounen"), + Pair("Slice of Life", "slice-of-life"), + Pair("Smut", "smut"), + Pair("Sports", "sports"), + Pair("Supernatural", "supernatural"), + Pair("Thriller", "thriller"), + Pair("Tragedy", "tragedy"), + Pair("Vampire", "vampire"), + Pair("Vanilla", "vanilla"), + Pair("Webtoon", "webtoon"), + Pair("Webtoons", "webtoons"), + Pair("Yaoi", "yaoi"), + Pair("Yuri", "yuri"), + Pair("Zombie", "zombie"), + ) +} diff --git a/multisrc/overrides/bakkin/bakkinselfhosted/src/BakkinSelfHosted.kt b/multisrc/overrides/bakkin/bakkinselfhosted/src/BakkinSelfHosted.kt new file mode 100644 index 000000000..883978188 --- /dev/null +++ b/multisrc/overrides/bakkin/bakkinselfhosted/src/BakkinSelfHosted.kt @@ -0,0 +1,27 @@ +package eu.kanade.tachiyomi.extension.en.bakkinselfhosted + +import androidx.preference.EditTextPreference +import androidx.preference.PreferenceScreen +import eu.kanade.tachiyomi.multisrc.bakkin.BakkinReaderX + +class BakkinSelfHosted : BakkinReaderX("Bakkin Self-hosted", "", "en") { + override val baseUrl by lazy { + preferences.getString("baseUrl", "http://127.0.0.1/")!! + } + + override fun setupPreferenceScreen(screen: PreferenceScreen) { + super.setupPreferenceScreen(screen) + EditTextPreference(screen.context).apply { + key = "baseUrl" + title = "Custom URL" + summary = "Connect to a self-hosted Bakkin Reader X server" + setDefaultValue("http://127.0.0.1/") + + setOnPreferenceChangeListener { _, newValue -> + // Make sure the URL ends with one slash + val url = (newValue as String).trimEnd('/') + '/' + preferences.edit().putString("baseUrl", url).commit() + } + }.let(screen::addPreference) + } +} diff --git a/multisrc/overrides/bakkin/default/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/bakkin/default/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..b42c408da Binary files /dev/null and b/multisrc/overrides/bakkin/default/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/bakkin/default/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/bakkin/default/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..2b23e8137 Binary files /dev/null and b/multisrc/overrides/bakkin/default/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/bakkin/default/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/bakkin/default/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..fd7c6a79f Binary files /dev/null and b/multisrc/overrides/bakkin/default/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/bakkin/default/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/bakkin/default/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..f43ff5819 Binary files /dev/null and b/multisrc/overrides/bakkin/default/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/bakkin/default/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/bakkin/default/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..436cfe887 Binary files /dev/null and b/multisrc/overrides/bakkin/default/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/bakkin/ultralightscans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/bakkin/ultralightscans/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..3c63782e6 Binary files /dev/null and b/multisrc/overrides/bakkin/ultralightscans/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/bakkin/ultralightscans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/bakkin/ultralightscans/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..b55c6170f Binary files /dev/null and b/multisrc/overrides/bakkin/ultralightscans/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/bakkin/ultralightscans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/bakkin/ultralightscans/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..da89de046 Binary files /dev/null and b/multisrc/overrides/bakkin/ultralightscans/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/bakkin/ultralightscans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/bakkin/ultralightscans/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..c3ca49516 Binary files /dev/null and b/multisrc/overrides/bakkin/ultralightscans/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/bakkin/ultralightscans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/bakkin/ultralightscans/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..6347f8c8f Binary files /dev/null and b/multisrc/overrides/bakkin/ultralightscans/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/bilibili/bilibilicomics/AndroidManifest.xml b/multisrc/overrides/bilibili/bilibilicomics/AndroidManifest.xml new file mode 100644 index 000000000..b12ae7a39 --- /dev/null +++ b/multisrc/overrides/bilibili/bilibilicomics/AndroidManifest.xml @@ -0,0 +1,26 @@ + + + + + + + + + + + + + + + + + + + + + + diff --git a/multisrc/overrides/bilibili/bilibilicomics/src/BilibiliComicsFactory.kt b/multisrc/overrides/bilibili/bilibilicomics/src/BilibiliComicsFactory.kt new file mode 100644 index 000000000..c7b2234e8 --- /dev/null +++ b/multisrc/overrides/bilibili/bilibilicomics/src/BilibiliComicsFactory.kt @@ -0,0 +1,411 @@ +package eu.kanade.tachiyomi.extension.all.bilibilicomics + +import eu.kanade.tachiyomi.multisrc.bilibili.Bilibili +import eu.kanade.tachiyomi.multisrc.bilibili.BilibiliAccessToken +import eu.kanade.tachiyomi.multisrc.bilibili.BilibiliAccessTokenCookie +import eu.kanade.tachiyomi.multisrc.bilibili.BilibiliComicDto +import eu.kanade.tachiyomi.multisrc.bilibili.BilibiliCredential +import eu.kanade.tachiyomi.multisrc.bilibili.BilibiliGetCredential +import eu.kanade.tachiyomi.multisrc.bilibili.BilibiliIntl +import eu.kanade.tachiyomi.multisrc.bilibili.BilibiliSearchDto +import eu.kanade.tachiyomi.multisrc.bilibili.BilibiliTag +import eu.kanade.tachiyomi.multisrc.bilibili.BilibiliUnlockedEpisode +import eu.kanade.tachiyomi.multisrc.bilibili.BilibiliUserEpisodes +import eu.kanade.tachiyomi.network.POST +import eu.kanade.tachiyomi.source.SourceFactory +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 kotlinx.serialization.decodeFromString +import kotlinx.serialization.encodeToString +import kotlinx.serialization.json.buildJsonObject +import kotlinx.serialization.json.put +import okhttp3.HttpUrl +import okhttp3.HttpUrl.Companion.toHttpUrl +import okhttp3.Interceptor +import okhttp3.OkHttpClient +import okhttp3.Request +import okhttp3.RequestBody.Companion.toRequestBody +import okhttp3.Response +import okio.Buffer +import java.io.IOException +import java.net.URLDecoder +import java.util.Calendar + +class BilibiliComicsFactory : SourceFactory { + override fun createSources() = listOf( + BilibiliComicsEn(), + BilibiliComicsCn(), + BilibiliComicsId(), + BilibiliComicsEs(), + BilibiliComicsFr(), + ) +} + +abstract class BilibiliComics(lang: String) : Bilibili( + "BILIBILI COMICS", + "https://www.bilibilicomics.com", + lang, +) { + + override val client: OkHttpClient = super.client.newBuilder() + .apply { interceptors().add(0, Interceptor { chain -> signedInIntercept(chain) }) } + .build() + + init { + setAccessTokenCookie(baseUrl.toHttpUrl()) + } + + override val signedIn: Boolean + get() = accessTokenCookie != null + + private val globalApiSubDomain: String + get() = GLOBAL_API_SUBDOMAINS[(accessTokenCookie?.area?.toIntOrNull() ?: 1) - 1] + + private val globalApiBaseUrl: String + get() = "https://$globalApiSubDomain.bilibilicomics.com" + + private var accessTokenCookie: BilibiliAccessTokenCookie? = null + + private val dayOfWeek: Int + get() = Calendar.getInstance().get(Calendar.DAY_OF_WEEK) - 1 + + override fun latestUpdatesRequest(page: Int): Request { + val jsonPayload = buildJsonObject { put("day", dayOfWeek) } + val requestBody = jsonPayload.toString().toRequestBody(JSON_MEDIA_TYPE) + + val newHeaders = headersBuilder() + .add("Content-Length", requestBody.contentLength().toString()) + .add("Content-Type", requestBody.contentType().toString()) + .set("Referer", "$baseUrl/schedule") + .build() + + val apiUrl = "$baseUrl/$API_COMIC_V1_COMIC_ENDPOINT/GetSchedule".toHttpUrl().newBuilder() + .addCommonParameters() + .toString() + + return POST(apiUrl, newHeaders, requestBody) + } + + override fun latestUpdatesParse(response: Response): MangasPage { + val result = response.parseAs() + + if (result.code != 0) { + return MangasPage(emptyList(), hasNextPage = false) + } + + val comicList = result.data!!.list.map(::latestMangaFromObject) + + return MangasPage(comicList, hasNextPage = false) + } + + protected open fun latestMangaFromObject(comic: BilibiliComicDto): SManga = SManga.create().apply { + title = comic.title + thumbnail_url = comic.verticalCover + THUMBNAIL_RESOLUTION + url = "/detail/mc${comic.comicId}" + } + + override fun chapterListParse(response: Response): List { + if (!signedIn) { + return super.chapterListParse(response) + } + + val result = response.parseAs() + + if (result.code != 0) { + return emptyList() + } + + val comic = result.data!! + + val userEpisodesRequest = userEpisodesRequest(comic.id) + val userEpisodesResponse = client.newCall(userEpisodesRequest).execute() + val unlockedEpisodes = userEpisodesParse(userEpisodesResponse) + + return comic.episodeList.map { ep -> chapterFromObject(ep, comic.id, isUnlocked = ep.id in unlockedEpisodes) } + } + + private fun userEpisodesRequest(comicId: Int): Request { + val jsonPayload = buildJsonObject { put("comic_id", comicId) } + val requestBody = jsonPayload.toString().toRequestBody(JSON_MEDIA_TYPE) + + val newHeaders = headersBuilder() + .set("Referer", baseUrl) + .build() + + val apiUrl = "$globalApiBaseUrl/$API_COMIC_V1_USER_ENDPOINT/GetUserEpisodes".toHttpUrl() + .newBuilder() + .addCommonParameters() + .toString() + + return POST(apiUrl, newHeaders, requestBody) + } + + private fun userEpisodesParse(response: Response): List { + if (!response.isSuccessful) { + return emptyList() + } + + val result = response.parseAs() + + if (result.code != 0) { + return emptyList() + } + + return result.data!!.unlockedEpisodes.orEmpty() + .map(BilibiliUnlockedEpisode::id) + } + + override fun pageListRequest(chapter: SChapter): Request { + if (!signedIn) { + return super.pageListRequest(chapter) + } + + val chapterPaths = (baseUrl + chapter.url).toHttpUrl().pathSegments + val comicId = chapterPaths[0].removePrefix("mc").toInt() + val episodeId = chapterPaths[1].toInt() + + val jsonPayload = BilibiliGetCredential(comicId, episodeId, 1) + val requestBody = json.encodeToString(jsonPayload).toRequestBody(JSON_MEDIA_TYPE) + + val newHeaders = headersBuilder() + .set("Referer", baseUrl + chapter.url) + .build() + + val apiUrl = "$globalApiBaseUrl/$API_GLOBAL_V1_USER_ENDPOINT/GetCredential".toHttpUrl() + .newBuilder() + .addCommonParameters() + .toString() + + return POST(apiUrl, newHeaders, requestBody) + } + + override fun pageListParse(response: Response): List { + if (!signedIn) { + return super.pageListParse(response) + } + + if (!response.isSuccessful) { + throw Exception(intl.failedToGetCredential) + } + + val result = response.parseAs() + val credential = result.data?.credential ?: "" + + val requestPayload = response.request.bodyString + val credentialInfo = json.decodeFromString(requestPayload) + val chapterUrl = "/mc${credentialInfo.comicId}/${credentialInfo.episodeId}" + + val imageIndexRequest = imageIndexRequest(chapterUrl, credential) + val imageIndexResponse = client.newCall(imageIndexRequest).execute() + + return super.pageListParse(imageIndexResponse) + } + + private fun setAccessTokenCookie(url: HttpUrl) { + val authCookie = client.cookieJar.loadForRequest(url) + .firstOrNull { cookie -> cookie.name == ACCESS_TOKEN_COOKIE_NAME } + ?.let { cookie -> URLDecoder.decode(cookie.value, "UTF-8") } + ?.let { jsonString -> json.decodeFromString(jsonString) } + + if (accessTokenCookie == null) { + accessTokenCookie = authCookie + } else if (authCookie == null) { + accessTokenCookie = null + } + } + + private fun signedInIntercept(chain: Interceptor.Chain): Response { + var request = chain.request() + val requestUrl = request.url.toString() + + if (!requestUrl.contains("bilibilicomics.com")) { + return chain.proceed(request) + } + + setAccessTokenCookie(request.url) + + if (!accessTokenCookie?.accessToken.isNullOrEmpty()) { + request = request.newBuilder() + .addHeader("Authorization", "Bearer ${accessTokenCookie!!.accessToken}") + .build() + } + + val response = chain.proceed(request) + + // Try to refresh the token if it expired. + if (response.code == 401 && !accessTokenCookie?.refreshToken.isNullOrEmpty()) { + response.close() + + val refreshTokenRequest = refreshTokenRequest( + accessTokenCookie!!.accessToken, + accessTokenCookie!!.refreshToken, + ) + val refreshTokenResponse = chain.proceed(refreshTokenRequest) + + accessTokenCookie = refreshTokenParse(refreshTokenResponse) + refreshTokenResponse.close() + + request = request.newBuilder() + .header("Authorization", "Bearer ${accessTokenCookie!!.accessToken}") + .build() + return chain.proceed(request) + } + + return response + } + + private fun refreshTokenRequest(accessToken: String, refreshToken: String): Request { + val jsonPayload = buildJsonObject { put("refresh_token", refreshToken) } + val requestBody = jsonPayload.toString().toRequestBody(JSON_MEDIA_TYPE) + + val newHeaders = headersBuilder() + .add("Authorization", "Bearer $accessToken") + .set("Referer", baseUrl) + .build() + + val apiUrl = "$globalApiBaseUrl/$API_GLOBAL_V1_USER_ENDPOINT/RefreshToken".toHttpUrl() + .newBuilder() + .addCommonParameters() + .toString() + + return POST(apiUrl, newHeaders, requestBody) + } + + private fun refreshTokenParse(response: Response): BilibiliAccessTokenCookie { + if (!response.isSuccessful) { + throw IOException(intl.failedToRefreshToken) + } + + val result = response.parseAs() + + if (result.code != 0) { + throw IOException(intl.failedToRefreshToken) + } + + val accessToken = result.data!! + + return BilibiliAccessTokenCookie( + accessToken.accessToken, + accessToken.refreshToken, + accessTokenCookie!!.area, + ) + } + + private val Request.bodyString: String + get() { + val requestCopy = newBuilder().build() + val buffer = Buffer() + + return runCatching { buffer.apply { requestCopy.body!!.writeTo(this) }.readUtf8() } + .getOrNull() ?: "" + } + + companion object { + private const val ACCESS_TOKEN_COOKIE_NAME = "access_token" + + private val GLOBAL_API_SUBDOMAINS = arrayOf("us-user", "sg-user") + private const val API_GLOBAL_V1_USER_ENDPOINT = "twirp/global.v1.User" + private const val API_COMIC_V1_USER_ENDPOINT = "twirp/comic.v1.User" + } +} + +class BilibiliComicsEn : BilibiliComics(BilibiliIntl.ENGLISH) { + + override fun getAllGenres(): Array = arrayOf( + BilibiliTag("All", -1), + BilibiliTag("Action", 19), + BilibiliTag("Adventure", 22), + BilibiliTag("BL", 3), + BilibiliTag("Comedy", 14), + BilibiliTag("Eastern", 30), + BilibiliTag("Fantasy", 11), + BilibiliTag("GL", 16), + BilibiliTag("Harem", 15), + BilibiliTag("Historical", 12), + BilibiliTag("Horror", 23), + BilibiliTag("Mistery", 17), + BilibiliTag("Romance", 13), + BilibiliTag("Slice of Life", 21), + BilibiliTag("Suspense", 41), + BilibiliTag("Teen", 20), + ) +} + +class BilibiliComicsCn : BilibiliComics(BilibiliIntl.SIMPLIFIED_CHINESE) { + + override fun getAllGenres(): Array = arrayOf( + BilibiliTag("全部", -1), + BilibiliTag("校园", 18), + BilibiliTag("都市", 9), + BilibiliTag("耽美", 3), + BilibiliTag("少女", 20), + BilibiliTag("恋爱", 13), + BilibiliTag("奇幻", 11), + BilibiliTag("热血", 19), + BilibiliTag("冒险", 22), + BilibiliTag("古风", 12), + BilibiliTag("百合", 16), + BilibiliTag("玄幻", 30), + BilibiliTag("悬疑", 41), + BilibiliTag("科幻", 8), + ) +} + +class BilibiliComicsId : BilibiliComics(BilibiliIntl.INDONESIAN) { + + override fun getAllGenres(): Array = arrayOf( + BilibiliTag("Semua", -1), + BilibiliTag("Aksi", 19), + BilibiliTag("Fantasi Timur", 30), + BilibiliTag("Fantasi", 11), + BilibiliTag("Historis", 12), + BilibiliTag("Horror", 23), + BilibiliTag("Kampus", 18), + BilibiliTag("Komedi", 14), + BilibiliTag("Menegangkan", 41), + BilibiliTag("Remaja", 20), + BilibiliTag("Romantis", 13), + ) +} + +class BilibiliComicsEs : BilibiliComics(BilibiliIntl.SPANISH) { + + override fun getAllGenres(): Array = arrayOf( + BilibiliTag("Todos", -1), + BilibiliTag("Adolescencia", 105), + BilibiliTag("BL", 3), + BilibiliTag("Ciberdeportes", 104), + BilibiliTag("Ciencia ficción", 8), + BilibiliTag("Comedia", 14), + BilibiliTag("Fantasía occidental", 106), + BilibiliTag("Fantasía", 11), + BilibiliTag("Ficción Realista", 116), + BilibiliTag("GL", 16), + BilibiliTag("Histórico", 12), + BilibiliTag("Horror", 23), + BilibiliTag("Juvenil", 20), + BilibiliTag("Moderno", 111), + BilibiliTag("Oriental", 30), + BilibiliTag("Romance", 13), + BilibiliTag("Suspenso", 41), + BilibiliTag("Urbano", 9), + BilibiliTag("Wuxia", 103), + ) +} + +class BilibiliComicsFr : BilibiliComics(BilibiliIntl.FRENCH) { + + override fun getAllGenres(): Array = arrayOf( + BilibiliTag("Tout", -1), + BilibiliTag("BL", 3), + BilibiliTag("Science Fiction", 8), + BilibiliTag("Historique", 12), + BilibiliTag("Romance", 13), + BilibiliTag("GL", 16), + BilibiliTag("Fantasy Orientale", 30), + BilibiliTag("Suspense", 41), + BilibiliTag("Moderne", 111), + ) +} diff --git a/multisrc/overrides/bilibili/bilibilimanga/AndroidManifest.xml b/multisrc/overrides/bilibili/bilibilimanga/AndroidManifest.xml new file mode 100644 index 000000000..6b86dbfce --- /dev/null +++ b/multisrc/overrides/bilibili/bilibilimanga/AndroidManifest.xml @@ -0,0 +1,25 @@ + + + + + + + + + + + + + + + + + + + + + diff --git a/multisrc/overrides/bilibili/bilibilimanga/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/bilibili/bilibilimanga/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..db7eed80c Binary files /dev/null and b/multisrc/overrides/bilibili/bilibilimanga/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/bilibili/bilibilimanga/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/bilibili/bilibilimanga/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..f14014676 Binary files /dev/null and b/multisrc/overrides/bilibili/bilibilimanga/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/bilibili/bilibilimanga/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/bilibili/bilibilimanga/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..426304e5c Binary files /dev/null and b/multisrc/overrides/bilibili/bilibilimanga/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/bilibili/bilibilimanga/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/bilibili/bilibilimanga/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..ed35c4c57 Binary files /dev/null and b/multisrc/overrides/bilibili/bilibilimanga/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/bilibili/bilibilimanga/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/bilibili/bilibilimanga/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..600a188b8 Binary files /dev/null and b/multisrc/overrides/bilibili/bilibilimanga/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/bilibili/bilibilimanga/src/BilibiliManga.kt b/multisrc/overrides/bilibili/bilibilimanga/src/BilibiliManga.kt new file mode 100644 index 000000000..5530389a4 --- /dev/null +++ b/multisrc/overrides/bilibili/bilibilimanga/src/BilibiliManga.kt @@ -0,0 +1,83 @@ +package eu.kanade.tachiyomi.extension.zh.bilibilimanga + +import eu.kanade.tachiyomi.multisrc.bilibili.Bilibili +import eu.kanade.tachiyomi.multisrc.bilibili.BilibiliComicDto +import eu.kanade.tachiyomi.multisrc.bilibili.BilibiliIntl +import eu.kanade.tachiyomi.multisrc.bilibili.BilibiliTag +import eu.kanade.tachiyomi.source.model.SChapter +import okhttp3.Headers +import okhttp3.Response + +class BilibiliManga : Bilibili( + "哔哩哔哩漫画", + "https://manga.bilibili.com", + BilibiliIntl.SIMPLIFIED_CHINESE, +) { + + override val id: Long = 3561131545129718586 + + override fun headersBuilder() = Headers.Builder().apply { + add("User-Agent", DEFAULT_USER_AGENT) + } + + override fun chapterListParse(response: Response): List { + val result = response.parseAs() + + if (result.code != 0) { + return emptyList() + } + + return result.data!!.episodeList + .filter { episode -> episode.isInFree || !episode.isLocked } + .map { ep -> chapterFromObject(ep, result.data.id) } + } + + override val defaultPopularSort: Int = 0 + + override val defaultLatestSort: Int = 1 + + override fun getAllSortOptions(): Array = arrayOf( + BilibiliTag(intl.sortPopular, 0), + BilibiliTag(intl.sortUpdated, 1), + BilibiliTag(intl.sortFollowers, 2), + BilibiliTag(intl.sortAdded, 3), + ) + + override fun getAllPrices(): Array = + arrayOf(intl.priceAll, intl.priceFree, intl.pricePaid, intl.priceWaitForFree) + + override fun getAllGenres(): Array = arrayOf( + BilibiliTag("全部", -1), + BilibiliTag("竞技", 1034), + BilibiliTag("冒险", 1013), + BilibiliTag("热血", 999), + BilibiliTag("搞笑", 994), + BilibiliTag("恋爱", 995), + BilibiliTag("少女", 1026), + BilibiliTag("日常", 1020), + BilibiliTag("校园", 1001), + BilibiliTag("治愈", 1007), + BilibiliTag("古风", 997), + BilibiliTag("玄幻", 1016), + BilibiliTag("奇幻", 998), + BilibiliTag("惊奇", 996), + BilibiliTag("悬疑", 1023), + BilibiliTag("都市", 1002), + BilibiliTag("剧情", 1030), + BilibiliTag("总裁", 1004), + BilibiliTag("科幻", 1015), + BilibiliTag("正能量", 1028), + ) + + override fun getAllAreas(): Array = arrayOf( + BilibiliTag("全部", -1), + BilibiliTag("大陆", 1), + BilibiliTag("日本", 2), + BilibiliTag("韩国", 6), + BilibiliTag("其他", 5), + ) + + companion object { + const val DEFAULT_USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/88.0.4324.150 Safari/537.36 Edg/88.0.705.63" + } +} diff --git a/multisrc/overrides/bilibili/default/AndroidManifest.xml b/multisrc/overrides/bilibili/default/AndroidManifest.xml new file mode 100644 index 000000000..4ca185feb --- /dev/null +++ b/multisrc/overrides/bilibili/default/AndroidManifest.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + diff --git a/multisrc/overrides/comicgamma/webcomicgamma/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/comicgamma/webcomicgamma/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..66b158ae8 Binary files /dev/null and b/multisrc/overrides/comicgamma/webcomicgamma/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/comicgamma/webcomicgamma/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/comicgamma/webcomicgamma/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..ebdb3ba56 Binary files /dev/null and b/multisrc/overrides/comicgamma/webcomicgamma/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/comicgamma/webcomicgamma/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/comicgamma/webcomicgamma/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..10e8972dd Binary files /dev/null and b/multisrc/overrides/comicgamma/webcomicgamma/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/comicgamma/webcomicgamma/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/comicgamma/webcomicgamma/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..96d8d433e Binary files /dev/null and b/multisrc/overrides/comicgamma/webcomicgamma/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/comicgamma/webcomicgamma/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/comicgamma/webcomicgamma/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..1790fcb89 Binary files /dev/null and b/multisrc/overrides/comicgamma/webcomicgamma/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/comicgamma/webcomicgammaplus/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/comicgamma/webcomicgammaplus/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..9b19a665f Binary files /dev/null and b/multisrc/overrides/comicgamma/webcomicgammaplus/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/comicgamma/webcomicgammaplus/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/comicgamma/webcomicgammaplus/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..6b07bb882 Binary files /dev/null and b/multisrc/overrides/comicgamma/webcomicgammaplus/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/comicgamma/webcomicgammaplus/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/comicgamma/webcomicgammaplus/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..dcf9aee84 Binary files /dev/null and b/multisrc/overrides/comicgamma/webcomicgammaplus/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/comicgamma/webcomicgammaplus/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/comicgamma/webcomicgammaplus/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..0345f8b7c Binary files /dev/null and b/multisrc/overrides/comicgamma/webcomicgammaplus/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/comicgamma/webcomicgammaplus/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/comicgamma/webcomicgammaplus/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..4030dbf77 Binary files /dev/null and b/multisrc/overrides/comicgamma/webcomicgammaplus/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/eromuse/default/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/eromuse/default/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..ed7255f26 Binary files /dev/null and b/multisrc/overrides/eromuse/default/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/eromuse/default/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/eromuse/default/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..93b95f52e Binary files /dev/null and b/multisrc/overrides/eromuse/default/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/eromuse/default/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/eromuse/default/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..61a27645f Binary files /dev/null and b/multisrc/overrides/eromuse/default/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/eromuse/default/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/eromuse/default/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..ec70641b2 Binary files /dev/null and b/multisrc/overrides/eromuse/default/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/eromuse/default/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/eromuse/default/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..91ea439c7 Binary files /dev/null and b/multisrc/overrides/eromuse/default/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/eromuse/eightmuses/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/eromuse/eightmuses/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..9ff6f8aab Binary files /dev/null and b/multisrc/overrides/eromuse/eightmuses/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/eromuse/eightmuses/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/eromuse/eightmuses/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..01a87032b Binary files /dev/null and b/multisrc/overrides/eromuse/eightmuses/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/eromuse/eightmuses/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/eromuse/eightmuses/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..e201b6dfc Binary files /dev/null and b/multisrc/overrides/eromuse/eightmuses/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/eromuse/eightmuses/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/eromuse/eightmuses/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..da807d352 Binary files /dev/null and b/multisrc/overrides/eromuse/eightmuses/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/eromuse/eightmuses/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/eromuse/eightmuses/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..b3d3571cb Binary files /dev/null and b/multisrc/overrides/eromuse/eightmuses/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/eromuse/eightmuses/src/EightMuses.kt b/multisrc/overrides/eromuse/eightmuses/src/EightMuses.kt new file mode 100644 index 000000000..c682addc9 --- /dev/null +++ b/multisrc/overrides/eromuse/eightmuses/src/EightMuses.kt @@ -0,0 +1,7 @@ +package eu.kanade.tachiyomi.extension.en.eightmuses + +import eu.kanade.tachiyomi.multisrc.eromuse.EroMuse +import kotlin.ExperimentalStdlibApi + +@ExperimentalStdlibApi +class EightMuses : EroMuse("8Muses", "https://comics.8muses.com") diff --git a/multisrc/overrides/eromuse/erofus/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/eromuse/erofus/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..b7fd96973 Binary files /dev/null and b/multisrc/overrides/eromuse/erofus/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/eromuse/erofus/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/eromuse/erofus/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..b1548bf42 Binary files /dev/null and b/multisrc/overrides/eromuse/erofus/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/eromuse/erofus/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/eromuse/erofus/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..f86e2ae3d Binary files /dev/null and b/multisrc/overrides/eromuse/erofus/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/eromuse/erofus/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/eromuse/erofus/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..20b3ef2b6 Binary files /dev/null and b/multisrc/overrides/eromuse/erofus/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/eromuse/erofus/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/eromuse/erofus/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..11cdba01a Binary files /dev/null and b/multisrc/overrides/eromuse/erofus/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/eromuse/erofus/src/Erofus.kt b/multisrc/overrides/eromuse/erofus/src/Erofus.kt new file mode 100644 index 000000000..1bb7fb34e --- /dev/null +++ b/multisrc/overrides/eromuse/erofus/src/Erofus.kt @@ -0,0 +1,165 @@ +package eu.kanade.tachiyomi.extension.en.erofus + +import eu.kanade.tachiyomi.multisrc.eromuse.EroMuse +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.SManga +import eu.kanade.tachiyomi.util.asJsoup +import okhttp3.HttpUrl.Companion.toHttpUrl +import okhttp3.Response +import rx.Observable + +@ExperimentalStdlibApi +class Erofus : EroMuse("Erofus", "https://www.erofus.com") { + + override val albumSelector = "a.a-click" + override val topLevelPathSegment = "comics" + + override fun fetchPopularManga(page: Int): Observable = fetchManga("$baseUrl/comics/various-authors?sort=viewed&page=1", page, "viewed") + override fun fetchLatestUpdates(page: Int): Observable = fetchManga("$baseUrl/comics/various-authors?sort=recent&page=1", page, "recent") + override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable { + if (page == 1) { + pageStack.clear() + + val filterList = if (filters.isEmpty()) getFilterList() else filters + currentSortingMode = filterList.filterIsInstance().first().toQueryValue() + + if (query.isNotBlank()) { + // TODO possibly add genre search if a decent list of them can be built + pageStack.addLast(StackItem("$baseUrl/?search=$query&sort=$currentSortingMode&page=1", SEARCH_RESULTS_OR_BASE)) + } else { + val albumFilter = filterList.filterIsInstance().first().selection() + val url = (baseUrl + albumFilter.pathSegments).toHttpUrl().newBuilder() + .addQueryParameter("sort", currentSortingMode) + .addQueryParameter("page", "1") + + pageStack.addLast(StackItem(url.toString(), albumFilter.pageType)) + } + } + + return client.newCall(stackRequest()) + .asObservableSuccess() + .map { response -> parseManga(response.asJsoup()) } + } + + override fun mangaDetailsParse(response: Response): SManga { + return SManga.create().apply { + with(response.asJsoup()) { + setUrlWithoutDomain(response.request.url.toString()) + thumbnail_url = select("$albumSelector img").firstOrNull()?.imgAttr() + author = when (getAlbumType(url)) { + AUTHOR -> { + // eg. https://www.erofus.com/comics/witchking00-comics/adventure-time + // eg. https://www.erofus.com/comics/mcc-comics/bearing-gifts/bearing-gifts-issue-1 + select("div.navigation-breadcrumb li:nth-child(3)").text() + } + VARIOUS_AUTHORS -> { + // eg. https://www.erofus.com/comics/various-authors/artdude41/bat-vore + select("div.navigation-breadcrumb li:nth-child(5)").text() + } + else -> null + } + + genre = select("div.album-tag-container a").joinToString { it.text() } + } + } + } + + override val linkedChapterSelector = "a.a-click:has(img)[href^=/comics/]" + override val pageThumbnailSelector = "a.a-click:has(img)[href*=/pic/] img" + + override val pageThumbnailPathSegment = "/thumb/" + override val pageFullSizePathSegment = "/medium/" + + override fun getAlbumList() = arrayOf( + Triple("All Authors", "", SEARCH_RESULTS_OR_BASE), + Triple("Various Authors", "/comics/various-authors", VARIOUS_AUTHORS), + Triple("Hentai and Manga English", "/comics/hentai-and-manga-english", VARIOUS_AUTHORS), + Triple("TabooLicious.xxx Comics", "/comics/taboolicious_xxx-comics", AUTHOR), + Triple("IllustratedInterracial.com Comics", "/comics/illustratedinterracial_com-comics", AUTHOR), + Triple("ZZZ Comics", "/comics/zzz-comics", AUTHOR), + Triple("JohnPersons.com Comics", "/comics/johnpersons_com-comics", AUTHOR), + Triple("For members only", "/", AUTHOR), + Triple("PalComix Comics", "/comics/palcomix-comics", AUTHOR), + Triple("Melkormancin.com Comics", "/comics/melkormancin_com-comics", AUTHOR), + Triple("TG Comics", "/comics/tg-comics", AUTHOR), + Triple("ShadBase Comics", "/comics/shadbase-comics", AUTHOR), + Triple("Filthy Figments Comics", "/comics/filthy-figments-comics", AUTHOR), + Triple("Witchking00 Comics", "/comics/witchking00-comics", AUTHOR), + Triple("Tease Comix", "/comics/tease-comix", AUTHOR), + Triple("PrismGirls Comics", "/comics/prismgirls-comics", AUTHOR), + Triple("Croc Comics", "/comics/croc-comics", AUTHOR), + Triple("CRAZYXXX3DWORLD Comics", "/comics/crazyxxx3dworld-comics", AUTHOR), + Triple("Moiarte Comics", "/comics/moiarte-comics", AUTHOR), + Triple("Nicole Heat Comics", "/comics/nicole-heat-comics", AUTHOR), + Triple("Expansion Comics", "/comics/expansion-comics", AUTHOR), + Triple("DizzyDills Comics", "/comics/dizzydills-comics", AUTHOR), + Triple("Hustler Cartoons", "/comics/hustler-cartoons", AUTHOR), + Triple("ArtOfJaguar Comics", "/comics/artofjaguar-comics", AUTHOR), + Triple("Grow Comics", "/comics/grow-comics", AUTHOR), + Triple("Bimbo Story Club Comics", "/comics/bimbo-story-club-comics", AUTHOR), + Triple("HentaiTNA.com Comics", "/comics/hentaitna_com-comics", AUTHOR), + Triple("ZZomp Comics", "/comics/zzomp-comics", AUTHOR), + Triple("Seiren.com.br Comics", "/comics/seiren_com_br-comics", AUTHOR), + Triple("DukesHardcoreHoneys.com Comics", "/comics/dukeshardcorehoneys_com-comics", AUTHOR), + Triple("Frozen Parody Comics", "/comics/frozen-parody-comics", AUTHOR), + Triple("Giantess Club Comics", "/comics/giantess-club-comics", AUTHOR), + Triple("Ultimate3DPorn Comics", "/comics/ultimate3dporn-comics", AUTHOR), + Triple("Sean Harrington Comics", "/comics/sean-harrington-comics", AUTHOR), + Triple("Central Comics", "/comics/central-comics", AUTHOR), + Triple("Mana World Comics", "/comics/mana-world-comics", AUTHOR), + Triple("The Foxxx Comics", "/comics/the-foxxx-comics", AUTHOR), + Triple("Bloody Sugar Comics", "/comics/bloody-sugar-comics", AUTHOR), + Triple("Deuce Comics", "/comics/deuce-comics", AUTHOR), + Triple("Adult Empire Comics", "/comics/adult-empire-comics", AUTHOR), + Triple("SuperHeroineComixxx", "/comics/superheroinecomixxx", AUTHOR), + Triple("Sluttish Comics", "/comics/sluttish-comics", AUTHOR), + Triple("Damn3D Comics", "/comics/damn3d-comics", AUTHOR), + Triple("Fake Celebrities Sex Pictures", "/comics/fake-celebrities-sex-pictures", AUTHOR), + Triple("Secret Chest Comics", "/comics/secret-chest-comics", AUTHOR), + Triple("Project Bellerophon Comics", "/comics/project-bellerophon-comics", AUTHOR), + Triple("Smudge Comics", "/comics/smudge-comics", AUTHOR), + Triple("Superheroine Central Comics", "/comics/superheroine-central-comics", AUTHOR), + Triple("Jay Marvel Comics", "/comics/jay-marvel-comics", AUTHOR), + Triple("Fred Perry Comics", "/comics/fred-perry-comics", AUTHOR), + Triple("Seduced Amanda Comics", "/comics/seduced-amanda-comics", AUTHOR), + Triple("VGBabes Comics", "/comics/vgbabes-comics", AUTHOR), + Triple("SodomSluts.com Comics", "/comics/sodomsluts_com-comics", AUTHOR), + Triple("AKABUR Comics", "/comics/akabur-comics", AUTHOR), + Triple("eBluberry Comics", "/comics/ebluberry-comics", AUTHOR), + Triple("InterracialComicPorn.com Comics", "/comics/interracialcomicporn_com-comics", AUTHOR), + Triple("Dubh3d-Dubhgilla Comics", "/comics/dubh3d-dubhgilla-comics", AUTHOR), + Triple("Gush Bomb Comix", "/comics/gush-bomb-comix", AUTHOR), + Triple("Chiyoji Tomo Comics", "/comics/chiyoji-tomo-comics", AUTHOR), + Triple("Mangrowing Comics", "/comics/mangrowing-comics", AUTHOR), + Triple("eAdultComics Collection", "/comics/eadultcomics-collection", AUTHOR), + Triple("Skulltitti Comics", "/comics/skulltitti-comics", AUTHOR), + Triple("James Lemay Comics", "/comics/james-lemay-comics", AUTHOR), + Triple("TalesOfPleasure.com Comics", "/comics/talesofpleasure_com-comics", AUTHOR), + Triple("Eden Comics", "/comics/eden-comics", AUTHOR), + Triple("WorldOfPeach Comics", "/comics/worldofpeach-comics", AUTHOR), + Triple("Daniel40 Comics", "/comics/daniel40-comics", AUTHOR), + Triple("DontFapGirl Comics", "/comics/dontfapgirl-comics", AUTHOR), + Triple("Wingbird Comics", "/comics/wingbird-comics", AUTHOR), + Triple("Intrigue3d.com Comics", "/comics/intrigue3d_com-comics", AUTHOR), + Triple("Hentaikey Comics", "/comics/hentaikey-comics", AUTHOR), + Triple("Kamina1978 Comics", "/comics/kamina1978-comics", AUTHOR), + Triple("3DPerils Comics", "/comics/3dperils-comics", AUTHOR), + Triple("Tracy Scops Comics", "/comics/tracy-scops-comics", AUTHOR), + Triple("Shemale3D Comics", "/comics/shemale3d-comics", AUTHOR), + Triple("InterracialSex3D.com Comics", "/comics/Interracialsex3d-Com-Comix", AUTHOR), + Triple("MyHentaiGrid Comics", "/comics/myhentaigrid-comics", AUTHOR), + Triple("Magnifire Comics", "/comics/magnifire-comics", AUTHOR), + Triple("Reptileye Comics", "/comics/reptileye-comics", AUTHOR), + Triple("ProjectPinkXXX.com Comics", "/comics/projectpinkxxx_com-comics", AUTHOR), + Triple("CallMePlisskin Comics", "/comics/callmeplisskin-comics", AUTHOR), + ) + + override fun getSortList() = arrayOf( + Pair("Viewed", "viewed"), + Pair("Liked", "liked"), + Pair("Date", "recent"), + Pair("A-Z", "az"), + ) +} 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 000000000..62a89997b 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 000000000..3ffb60b76 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 000000000..515447115 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 000000000..c550e843d 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 000000000..bb7d942e0 Binary files /dev/null and b/multisrc/overrides/fansubscat/fansubscat/res/mipmap-xxxhdpi/ic_launcher.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 000000000..abecc8907 --- /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 000000000..85c7cda14 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 000000000..3f52697c4 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 000000000..015a708e2 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 000000000..9d3a29b18 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 000000000..e3fb8c336 Binary files /dev/null and b/multisrc/overrides/fansubscat/fansubscathentai/res/mipmap-xxxhdpi/ic_launcher.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 000000000..704e68942 --- /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 000000000..96992a185 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 000000000..bf4daa417 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 000000000..8beccb9bc 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 000000000..d09cf7a56 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 000000000..9067ecd9c Binary files /dev/null and b/multisrc/overrides/flixscans/flixscans/res/mipmap-xxxhdpi/ic_launcher.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 000000000..9fbdbdb85 --- /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.org", "en", cdnUrl = "https://media.flixscans.org/") 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 000000000..508b1a1d1 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 000000000..8a5238888 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 000000000..0ced75903 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 000000000..e5e17f45d 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 000000000..2e68f0aab Binary files /dev/null and b/multisrc/overrides/flixscans/galaxymanga/res/mipmap-xxxhdpi/ic_launcher.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 000000000..b121b0117 --- /dev/null +++ b/multisrc/overrides/flixscans/galaxymanga/src/GalaxyManga.kt @@ -0,0 +1,13 @@ +package eu.kanade.tachiyomi.extension.ar.galaxymanga + +import eu.kanade.tachiyomi.multisrc.flixscans.FlixScans +import eu.kanade.tachiyomi.network.GET +import okhttp3.Request + +class GalaxyManga : FlixScans("جالاكسي مانجا", "https://flixscans.com", "ar") { + override val versionId = 2 + + override fun popularMangaRequest(page: Int): Request { + return GET("$apiUrl/webtoon/pages/home/action", headers) + } +} diff --git a/multisrc/overrides/fmreader/default/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/fmreader/default/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..902faf434 Binary files /dev/null and b/multisrc/overrides/fmreader/default/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/fmreader/default/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/fmreader/default/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..03d31f5e4 Binary files /dev/null and b/multisrc/overrides/fmreader/default/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/fmreader/default/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/fmreader/default/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..a5b3eb677 Binary files /dev/null and b/multisrc/overrides/fmreader/default/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/fmreader/default/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/fmreader/default/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..d57d63ca1 Binary files /dev/null and b/multisrc/overrides/fmreader/default/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/fmreader/default/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/fmreader/default/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..208aeca45 Binary files /dev/null and b/multisrc/overrides/fmreader/default/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/fmreader/epikmanga/src/EpikManga.kt b/multisrc/overrides/fmreader/epikmanga/src/EpikManga.kt new file mode 100644 index 000000000..c912175a7 --- /dev/null +++ b/multisrc/overrides/fmreader/epikmanga/src/EpikManga.kt @@ -0,0 +1,56 @@ +package eu.kanade.tachiyomi.extension.tr.epikmanga + +import eu.kanade.tachiyomi.multisrc.fmreader.FMReader +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.SManga +import eu.kanade.tachiyomi.util.asJsoup +import okhttp3.Request +import okhttp3.Response +import org.jsoup.nodes.Document +import rx.Observable + +class EpikManga : FMReader("Epik Manga", "https://www.epikmanga.com", "tr") { + override fun popularMangaRequest(page: Int): Request = GET("$baseUrl/seri-listesi?sorting=views&sorting-type=DESC&Sayfa=$page", headers) + override fun latestUpdatesRequest(page: Int): Request = GET("$baseUrl/seri-listesi?sorting=lastUpdate&sorting-type=DESC&Sayfa=$page", headers) + override fun popularMangaNextPageSelector() = "ul.pagination li.active + li:not(.disabled)" + + override val headerSelector = "h4 a" + + // search wasn't working on source's website + override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable { + return client.newCall(searchMangaRequest(page, query, filters)) + .asObservableSuccess() + .map { response -> + searchMangaParse(response, query) + } + } + override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request = GET("$baseUrl/seri-listesi?type=text", headers) + private fun searchMangaParse(response: Response, query: String): MangasPage { + val mangas = response.asJsoup().select("div.char.col-lg-4 a").toList() + .filter { it.text().contains(query, ignoreCase = true) } + .map { + SManga.create().apply { + setUrlWithoutDomain(it.attr("href")) + title = it.text() + } + } + return MangasPage(mangas, false) + } + override fun mangaDetailsParse(document: Document): SManga { + val infoElement = document.select("div.col-md-9 div.row").first()!! + + return SManga.create().apply { + status = parseStatus(infoElement.select("h4:contains(Durum:)").firstOrNull()?.ownText()) + author = infoElement.select("h4:contains(Yazar:)").firstOrNull()?.ownText() + artist = infoElement.select("h4:contains(Çizer:)").firstOrNull()?.ownText() + genre = infoElement.select("h4:contains(Türler:) a").joinToString { it.text() } + thumbnail_url = infoElement.select("img.thumbnail").imgAttr() + description = document.select("div.col-md-12 p").text() + } + } + override fun chapterListSelector() = "table.table tbody tr" + override fun getFilterList(): FilterList = FilterList() +} diff --git a/multisrc/overrides/fmreader/kisslove/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/fmreader/kisslove/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..96aa4eacd Binary files /dev/null and b/multisrc/overrides/fmreader/kisslove/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/fmreader/kisslove/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/fmreader/kisslove/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..758455806 Binary files /dev/null and b/multisrc/overrides/fmreader/kisslove/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/fmreader/kisslove/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/fmreader/kisslove/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..39639633c Binary files /dev/null and b/multisrc/overrides/fmreader/kisslove/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/fmreader/kisslove/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/fmreader/kisslove/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..e17702e9e Binary files /dev/null and b/multisrc/overrides/fmreader/kisslove/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/fmreader/kisslove/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/fmreader/kisslove/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..a2c3159f0 Binary files /dev/null and b/multisrc/overrides/fmreader/kisslove/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/fmreader/kisslove/src/KissLove.kt b/multisrc/overrides/fmreader/kisslove/src/KissLove.kt new file mode 100644 index 000000000..2e31fa7df --- /dev/null +++ b/multisrc/overrides/fmreader/kisslove/src/KissLove.kt @@ -0,0 +1,80 @@ +package eu.kanade.tachiyomi.extension.ja.kisslove + +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 + +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/manga1000/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/fmreader/manga1000/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..5dacae05d Binary files /dev/null and b/multisrc/overrides/fmreader/manga1000/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/fmreader/manga1000/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/fmreader/manga1000/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..b2d019b1f Binary files /dev/null and b/multisrc/overrides/fmreader/manga1000/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/fmreader/manga1000/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/fmreader/manga1000/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..35f957dfc Binary files /dev/null and b/multisrc/overrides/fmreader/manga1000/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/fmreader/manga1000/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/fmreader/manga1000/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..0c0d2953a Binary files /dev/null and b/multisrc/overrides/fmreader/manga1000/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/fmreader/manga1000/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/fmreader/manga1000/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..d40be4153 Binary files /dev/null and b/multisrc/overrides/fmreader/manga1000/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/fmreader/manga1000/src/Manga1000.kt b/multisrc/overrides/fmreader/manga1000/src/Manga1000.kt new file mode 100644 index 000000000..0cc98c8e1 --- /dev/null +++ b/multisrc/overrides/fmreader/manga1000/src/Manga1000.kt @@ -0,0 +1,40 @@ +package eu.kanade.tachiyomi.extension.ja.manga1000 + +import eu.kanade.tachiyomi.multisrc.fmreader.FMReader +import eu.kanade.tachiyomi.source.model.SChapter +import org.jsoup.nodes.Element +import java.util.Calendar + +class Manga1000 : FMReader("Manga1000", "https://manga1000.top", "ja") { + override fun chapterFromElement(element: Element, mangaTitle: String): SChapter { + return SChapter.create().apply { + element.let { + setUrlWithoutDomain(it.attr("abs: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 + } +} diff --git a/multisrc/overrides/fmreader/mangatr/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/fmreader/mangatr/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..14035980a Binary files /dev/null and b/multisrc/overrides/fmreader/mangatr/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/fmreader/mangatr/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/fmreader/mangatr/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..b1aa653e8 Binary files /dev/null and b/multisrc/overrides/fmreader/mangatr/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/fmreader/mangatr/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/fmreader/mangatr/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..73a642028 Binary files /dev/null and b/multisrc/overrides/fmreader/mangatr/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/fmreader/mangatr/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/fmreader/mangatr/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..892acb0dd Binary files /dev/null and b/multisrc/overrides/fmreader/mangatr/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/fmreader/mangatr/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/fmreader/mangatr/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..6eb90718c Binary files /dev/null and b/multisrc/overrides/fmreader/mangatr/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/fmreader/mangatr/src/MangaTR.kt b/multisrc/overrides/fmreader/mangatr/src/MangaTR.kt new file mode 100644 index 000000000..1575cd24a --- /dev/null +++ b/multisrc/overrides/fmreader/mangatr/src/MangaTR.kt @@ -0,0 +1,104 @@ +package eu.kanade.tachiyomi.extension.tr.mangatr + +import eu.kanade.tachiyomi.multisrc.fmreader.FMReader +import eu.kanade.tachiyomi.network.GET +import eu.kanade.tachiyomi.network.POST +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.SChapter +import eu.kanade.tachiyomi.source.model.SManga +import eu.kanade.tachiyomi.util.asJsoup +import okhttp3.FormBody +import okhttp3.Response +import org.jsoup.nodes.Document +import org.jsoup.nodes.Element +import rx.Observable + +class MangaTR : FMReader("Manga-TR", "https://manga-tr.com", "tr") { + override fun headersBuilder() = super.headersBuilder() + .add("Accept-Language", "en-US,en;q=0.5") + + override fun popularMangaNextPageSelector() = "div.btn-group:not(div.btn-block) button.btn-info" + + // =============================== Search =============================== + // TODO: genre search possible but a bit of a pain + override fun getFilterList() = FilterList() + + override fun searchMangaRequest(page: Int, query: String, filters: FilterList) = + GET("$baseUrl/arama.html?icerik=$query", headers) + + override fun searchMangaParse(response: Response): MangasPage { + val mangas = response.use { it.asJsoup() } + .select("div.row a[data-toggle]") + .filterNot { it.siblingElements().text().contains("Novel") } + .map(::searchMangaFromElement) + + return MangasPage(mangas, false) + } + + override fun searchMangaFromElement(element: Element) = SManga.create().apply { + setUrlWithoutDomain(element.absUrl("href")) + title = element.text() + } + + // =========================== Manga Details ============================ + override fun mangaDetailsParse(document: Document) = SManga.create().apply { + val infoElement = document.selectFirst("div#tab1")!! + infoElement.selectFirst("table + table tr + tr")?.run { + author = selectFirst("td:nth-child(1) a")?.text() + artist = selectFirst("td:nth-child(2) a")?.text() + genre = selectFirst("td:nth-child(3)")?.text() + } + description = infoElement.selectFirst("div.well")?.ownText()?.trim() + thumbnail_url = document.selectFirst("img.thumbnail")?.absUrl("src") + + status = infoElement.selectFirst("tr:contains(Çeviri Durumu) + tr > td:nth-child(2)") + .let { parseStatus(it?.text()) } + } + + // ============================== Chapters ============================== + override fun chapterListSelector() = "tr.table-bordered" + + override val chapterUrlSelector = "td[align=left] > a" + + override val chapterTimeSelector = "td[align=right]" + + private val chapterListHeaders by lazy { + headersBuilder().add("X-Requested-With", "XMLHttpRequest").build() + } + + override fun fetchChapterList(manga: SManga): Observable> { + val id = manga.url.substringAfter("manga-").substringBefore(".") + val requestUrl = "$baseUrl/cek/fetch_pages_manga.php?manga_cek=$id" + return client.newCall(GET(requestUrl, chapterListHeaders)) + .asObservableSuccess() + .map(::chapterListParse) + } + + override fun chapterListParse(response: Response): List { + // chapters are paginated + val chapters = buildList { + val requestUrl = response.request.url.toString() + var nextPage = 2 + do { + val doc = when { + isEmpty() -> response + else -> { + val body = FormBody.Builder() + .add("page", nextPage.toString()) + .build() + nextPage++ + client.newCall(POST(requestUrl, chapterListHeaders, body)).execute() + } + }.use { it.asJsoup() } + + addAll(doc.select(chapterListSelector()).map(::chapterFromElement)) + } while (doc.selectFirst("a[data-page=$nextPage]") != null) + } + return chapters + } + + override fun pageListRequest(chapter: SChapter) = + GET("$baseUrl/${chapter.url.substringAfter("cek/")}", headers) +} diff --git a/multisrc/overrides/fmreader/rawlh/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/fmreader/rawlh/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..b0cace0e6 Binary files /dev/null and b/multisrc/overrides/fmreader/rawlh/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/fmreader/rawlh/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/fmreader/rawlh/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..20e3f9f29 Binary files /dev/null and b/multisrc/overrides/fmreader/rawlh/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/fmreader/rawlh/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/fmreader/rawlh/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..0315dfcc6 Binary files /dev/null and b/multisrc/overrides/fmreader/rawlh/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/fmreader/rawlh/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/fmreader/rawlh/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..f60d7a0c8 Binary files /dev/null and b/multisrc/overrides/fmreader/rawlh/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/fmreader/rawlh/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/fmreader/rawlh/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..95c38e410 Binary files /dev/null and b/multisrc/overrides/fmreader/rawlh/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/fmreader/rawlh/src/WeLoveManga.kt b/multisrc/overrides/fmreader/rawlh/src/WeLoveManga.kt new file mode 100644 index 000000000..b9431823c --- /dev/null +++ b/multisrc/overrides/fmreader/rawlh/src/WeLoveManga.kt @@ -0,0 +1,44 @@ +package eu.kanade.tachiyomi.extension.ja.rawlh + +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.Document +import org.jsoup.nodes.Element + +class WeLoveManga : FMReader("WeLoveManga", "https://weloma.art", "ja") { + // Formerly "RawLH" + override val id = 7595224096258102519 + + override val chapterUrlSelector = "" + override fun pageListParse(document: Document): List { + fun Element.decoded(): String { + return this.attr("data-src").trimEnd() + } + + return document.select(pageListImageSelector).mapIndexed { i, img -> + Page(i, document.location(), img.decoded()) + } + } + + // 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/saytruyen/src/SayTruyen.kt b/multisrc/overrides/fmreader/saytruyen/src/SayTruyen.kt new file mode 100644 index 000000000..d4c7b0a30 --- /dev/null +++ b/multisrc/overrides/fmreader/saytruyen/src/SayTruyen.kt @@ -0,0 +1,32 @@ +package eu.kanade.tachiyomi.extension.vi.saytruyen + +import eu.kanade.tachiyomi.multisrc.fmreader.FMReader +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.Response +import org.jsoup.nodes.Document + +class SayTruyen : FMReader("Say Truyen", "https://saytruyenvip.com", "vi") { + override fun mangaDetailsParse(document: Document): SManga { + val info = document.select("div.row").first()!! + return SManga.create().apply { + author = info.select("div.row li:has(b:contains(Tác giả)) small").text() + genre = info.select("div.row li:has(b:contains(Thể loại)) small a").joinToString { it.text() } + status = parseStatus(info.select("div.row li:has(b:contains(Tình trạng)) a").text()) + description = document.select("div.description").text() + thumbnail_url = info.select("img.thumbnail").attr("abs:src") + } + } + override fun chapterListParse(response: Response): List { + return response.asJsoup().let { document -> + document.select(chapterListSelector()).map { + chapterFromElement(it).apply { + scanlator = document.select("div.row li:has(b:contains(Nhóm dịch)) small").text() + } + } + } + } + override fun pageListParse(document: Document): List = super.pageListParse(document).onEach { it.imageUrl!!.trim() } +} diff --git a/multisrc/overrides/fmreader/welovemangaone/src/WeLoveMangaOne.kt b/multisrc/overrides/fmreader/welovemangaone/src/WeLoveMangaOne.kt new file mode 100644 index 000000000..8c07321f4 --- /dev/null +++ b/multisrc/overrides/fmreader/welovemangaone/src/WeLoveMangaOne.kt @@ -0,0 +1,80 @@ +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 + +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 { + setUrlWithoutDomain(it.attr("abs: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 = "(\\d+)/".toRegex() + } +} diff --git a/multisrc/overrides/foolslide/anatanomotokare/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/foolslide/anatanomotokare/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..9c7d8975b Binary files /dev/null and b/multisrc/overrides/foolslide/anatanomotokare/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/foolslide/anatanomotokare/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/foolslide/anatanomotokare/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..2c8820b46 Binary files /dev/null and b/multisrc/overrides/foolslide/anatanomotokare/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/foolslide/anatanomotokare/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/foolslide/anatanomotokare/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..ed98721fc Binary files /dev/null and b/multisrc/overrides/foolslide/anatanomotokare/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/foolslide/anatanomotokare/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/foolslide/anatanomotokare/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..ac8e14a8e Binary files /dev/null and b/multisrc/overrides/foolslide/anatanomotokare/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/foolslide/anatanomotokare/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/foolslide/anatanomotokare/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..579a06e5e Binary files /dev/null and b/multisrc/overrides/foolslide/anatanomotokare/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/foolslide/anatanomotokare/src/AnataNoMotokare.kt b/multisrc/overrides/foolslide/anatanomotokare/src/AnataNoMotokare.kt new file mode 100644 index 000000000..c18e9a96b --- /dev/null +++ b/multisrc/overrides/foolslide/anatanomotokare/src/AnataNoMotokare.kt @@ -0,0 +1,5 @@ +package eu.kanade.tachiyomi.extension.en.anatanomotokare + +import eu.kanade.tachiyomi.multisrc.foolslide.FoolSlide + +class AnataNoMotokare : FoolSlide("Anata no Motokare", "https://motokare.xyz", "en", "/reader") diff --git a/multisrc/overrides/foolslide/baixarhentai/src/BaixarHentai.kt b/multisrc/overrides/foolslide/baixarhentai/src/BaixarHentai.kt new file mode 100644 index 000000000..82de5e6c4 --- /dev/null +++ b/multisrc/overrides/foolslide/baixarhentai/src/BaixarHentai.kt @@ -0,0 +1,27 @@ +package eu.kanade.tachiyomi.extension.pt.baixarhentai + +import androidx.preference.PreferenceScreen +import eu.kanade.tachiyomi.multisrc.foolslide.FoolSlide +import eu.kanade.tachiyomi.network.interceptor.rateLimit +import eu.kanade.tachiyomi.source.model.SManga +import org.jsoup.nodes.Document +import java.util.concurrent.TimeUnit + +class BaixarHentai : FoolSlide("Baixar Hentai", "https://leitura.baixarhentai.net", "pt-BR") { + // Hardcode the id because the language wasn't specific. + override val id = 8908032188831949972 + + override val client = super.client.newBuilder() + .rateLimit(1, 2, TimeUnit.SECONDS) + .build() + + override fun mangaDetailsParse(document: Document) = SManga.create().apply { + title = document.select("h1.title").text() + thumbnail_url = getDetailsThumbnail(document, "div.title a") + } + + // Always show adult content + override val allowAdult = true + + override fun setupPreferenceScreen(screen: PreferenceScreen) {} +} diff --git a/multisrc/overrides/foolslide/deathtollscans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/foolslide/deathtollscans/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..305e35639 Binary files /dev/null and b/multisrc/overrides/foolslide/deathtollscans/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/foolslide/deathtollscans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/foolslide/deathtollscans/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..bd3b5845d Binary files /dev/null and b/multisrc/overrides/foolslide/deathtollscans/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/foolslide/deathtollscans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/foolslide/deathtollscans/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..869e81849 Binary files /dev/null and b/multisrc/overrides/foolslide/deathtollscans/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/foolslide/deathtollscans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/foolslide/deathtollscans/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..db013ca07 Binary files /dev/null and b/multisrc/overrides/foolslide/deathtollscans/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/foolslide/deathtollscans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/foolslide/deathtollscans/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..7436d07f2 Binary files /dev/null and b/multisrc/overrides/foolslide/deathtollscans/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/foolslide/default/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/foolslide/default/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..707828065 Binary files /dev/null and b/multisrc/overrides/foolslide/default/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/foolslide/default/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/foolslide/default/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..5fa62ecd3 Binary files /dev/null and b/multisrc/overrides/foolslide/default/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/foolslide/default/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/foolslide/default/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..dc4e63998 Binary files /dev/null and b/multisrc/overrides/foolslide/default/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/foolslide/default/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/foolslide/default/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..1c14238ea Binary files /dev/null and b/multisrc/overrides/foolslide/default/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/foolslide/default/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/foolslide/default/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..1bf956780 Binary files /dev/null and b/multisrc/overrides/foolslide/default/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/foolslide/evilflowers/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/foolslide/evilflowers/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..9bb2a2403 Binary files /dev/null and b/multisrc/overrides/foolslide/evilflowers/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/foolslide/evilflowers/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/foolslide/evilflowers/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..c615f68a9 Binary files /dev/null and b/multisrc/overrides/foolslide/evilflowers/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/foolslide/evilflowers/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/foolslide/evilflowers/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..1a0d9bcff Binary files /dev/null and b/multisrc/overrides/foolslide/evilflowers/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/foolslide/evilflowers/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/foolslide/evilflowers/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..12cf4b237 Binary files /dev/null and b/multisrc/overrides/foolslide/evilflowers/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/foolslide/evilflowers/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/foolslide/evilflowers/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..74e2ee2d4 Binary files /dev/null and b/multisrc/overrides/foolslide/evilflowers/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/foolslide/foolslidecustomizable/src/FoolSlideCustomizableFactory.kt b/multisrc/overrides/foolslide/foolslidecustomizable/src/FoolSlideCustomizableFactory.kt new file mode 100644 index 000000000..0d1999663 --- /dev/null +++ b/multisrc/overrides/foolslide/foolslidecustomizable/src/FoolSlideCustomizableFactory.kt @@ -0,0 +1,49 @@ +package eu.kanade.tachiyomi.extension.all.foolslidecustomizable + +import android.widget.Toast +import androidx.preference.EditTextPreference +import androidx.preference.PreferenceScreen +import eu.kanade.tachiyomi.AppInfo +import eu.kanade.tachiyomi.multisrc.foolslide.FoolSlide +import eu.kanade.tachiyomi.source.SourceFactory + +class FoolSlideCustomizableFactory : SourceFactory { + override fun createSources() = listOf(FoolSlideCustomizable()) +} + +class FoolSlideCustomizable : FoolSlide("FoolSlide Customizable", "", "other") { + override val baseUrl: String by lazy { + preferences.getString(BASE_URL_PREF, DEFAULT_BASEURL)!!.substringBefore("/directory") + } + + override fun setupPreferenceScreen(screen: PreferenceScreen) { + super.setupPreferenceScreen(screen) + EditTextPreference(screen.context).apply { + key = BASE_URL_PREF_TITLE + title = BASE_URL_PREF_TITLE + summary = BASE_URL_PREF_SUMMARY + setDefaultValue(DEFAULT_BASEURL) + dialogTitle = BASE_URL_PREF_TITLE + dialogMessage = "Default: $DEFAULT_BASEURL" + + setOnPreferenceChangeListener { _, newValue -> + try { + val res = preferences.edit().putString(BASE_URL_PREF, newValue as String).commit() + Toast.makeText(screen.context, RESTART_TACHIYOMI, Toast.LENGTH_LONG).show() + res + } catch (e: Exception) { + e.printStackTrace() + false + } + } + }.let(screen::addPreference) + } + + companion object { + private const val DEFAULT_BASEURL = "https://127.0.0.1" + private const val BASE_URL_PREF_TITLE = "Example URL: https://domain.com/path_to/directory/" + private val BASE_URL_PREF = "overrideBaseUrl_v${AppInfo.getVersionName()}" + private const val BASE_URL_PREF_SUMMARY = "Connect to a designated FoolSlide server" + private const val RESTART_TACHIYOMI = "Restart Tachiyomi to apply new setting." + } +} diff --git a/multisrc/overrides/foolslide/hniscantrad/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/foolslide/hniscantrad/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..9c49e426a Binary files /dev/null and b/multisrc/overrides/foolslide/hniscantrad/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/foolslide/hniscantrad/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/foolslide/hniscantrad/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..175517371 Binary files /dev/null and b/multisrc/overrides/foolslide/hniscantrad/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/foolslide/hniscantrad/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/foolslide/hniscantrad/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..2dfde5cb3 Binary files /dev/null and b/multisrc/overrides/foolslide/hniscantrad/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/foolslide/hniscantrad/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/foolslide/hniscantrad/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..ded24a640 Binary files /dev/null and b/multisrc/overrides/foolslide/hniscantrad/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/foolslide/hniscantrad/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/foolslide/hniscantrad/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..6a517f186 Binary files /dev/null and b/multisrc/overrides/foolslide/hniscantrad/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/foolslide/hniscantrad/src/HNIScantradFactory.kt b/multisrc/overrides/foolslide/hniscantrad/src/HNIScantradFactory.kt new file mode 100644 index 000000000..b83c06f7f --- /dev/null +++ b/multisrc/overrides/foolslide/hniscantrad/src/HNIScantradFactory.kt @@ -0,0 +1,19 @@ +package eu.kanade.tachiyomi.extension.all.hniscantrad + +import eu.kanade.tachiyomi.multisrc.foolslide.FoolSlide +import eu.kanade.tachiyomi.source.SourceFactory +import okhttp3.Response + +class HNIScantradFactory : SourceFactory { + override fun createSources() = listOf(HNIScantradFR(), HNIScantradEN()) +} + +class HNIScantradFR : FoolSlide("HNI-Scantrad", "https://hni-scantrad.com", "fr", "/lel") { + override fun chapterListParse(response: Response) = + super.chapterListParse(response).filter { "/fr/" in it.url } +} + +class HNIScantradEN : FoolSlide("HNI-Scantrad", "https://hni-scantrad.com", "en", "/lel") { + override fun chapterListParse(response: Response) = + super.chapterListParse(response).filter { "/en-us/" in it.url } +} diff --git a/multisrc/overrides/foolslide/lecercleduscan/src/LeCercleDuScan.kt b/multisrc/overrides/foolslide/lecercleduscan/src/LeCercleDuScan.kt new file mode 100644 index 000000000..fb22ae810 --- /dev/null +++ b/multisrc/overrides/foolslide/lecercleduscan/src/LeCercleDuScan.kt @@ -0,0 +1,15 @@ +package eu.kanade.tachiyomi.extension.fr.lecercleduscan + +import eu.kanade.tachiyomi.multisrc.foolslide.FoolSlide +import java.util.Locale + +class LeCercleDuScan : FoolSlide("Le Cercle du Scan", "https://lel.lecercleduscan.com", "fr") { + override fun parseChapterDate(date: String) = super.parseChapterDate( + when (val lcDate = date.lowercase(Locale.FRENCH)) { + "hier" -> "yesterday" + "aujourd'hui" -> "today" + "demain" -> "tomorrow" + else -> lcDate + }, + ) +} diff --git a/multisrc/overrides/foolslide/mangatellers/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/foolslide/mangatellers/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..a31c87697 Binary files /dev/null and b/multisrc/overrides/foolslide/mangatellers/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/foolslide/mangatellers/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/foolslide/mangatellers/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..02c8bb187 Binary files /dev/null and b/multisrc/overrides/foolslide/mangatellers/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/foolslide/mangatellers/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/foolslide/mangatellers/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..721c83311 Binary files /dev/null and b/multisrc/overrides/foolslide/mangatellers/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/foolslide/mangatellers/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/foolslide/mangatellers/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..becc0e0f8 Binary files /dev/null and b/multisrc/overrides/foolslide/mangatellers/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/foolslide/mangatellers/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/foolslide/mangatellers/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..f5ced5084 Binary files /dev/null and b/multisrc/overrides/foolslide/mangatellers/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/foolslide/mangatellers/src/Mangatellers.kt b/multisrc/overrides/foolslide/mangatellers/src/Mangatellers.kt new file mode 100644 index 000000000..e93ac54e6 --- /dev/null +++ b/multisrc/overrides/foolslide/mangatellers/src/Mangatellers.kt @@ -0,0 +1,5 @@ +package eu.kanade.tachiyomi.extension.en.mangatellers + +import eu.kanade.tachiyomi.multisrc.foolslide.FoolSlide + +class Mangatellers : FoolSlide("Mangatellers", "https://reader.mangatellers.gr", "en") diff --git a/multisrc/overrides/foolslide/menudofansub/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/foolslide/menudofansub/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..6d27b0655 Binary files /dev/null and b/multisrc/overrides/foolslide/menudofansub/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/foolslide/menudofansub/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/foolslide/menudofansub/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..60a54d5b5 Binary files /dev/null and b/multisrc/overrides/foolslide/menudofansub/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/foolslide/menudofansub/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/foolslide/menudofansub/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..67130a7cd Binary files /dev/null and b/multisrc/overrides/foolslide/menudofansub/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/foolslide/menudofansub/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/foolslide/menudofansub/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..aa756f46a Binary files /dev/null and b/multisrc/overrides/foolslide/menudofansub/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/foolslide/menudofansub/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/foolslide/menudofansub/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..a5a0d89ef Binary files /dev/null and b/multisrc/overrides/foolslide/menudofansub/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/foolslide/menudofansub/src/MenudoFansub.kt b/multisrc/overrides/foolslide/menudofansub/src/MenudoFansub.kt new file mode 100644 index 000000000..f229fb312 --- /dev/null +++ b/multisrc/overrides/foolslide/menudofansub/src/MenudoFansub.kt @@ -0,0 +1,5 @@ +package eu.kanade.tachiyomi.extension.es.menudofansub + +import eu.kanade.tachiyomi.multisrc.foolslide.FoolSlide + +class MenudoFansub : FoolSlide("Menudo-Fansub", "https://www.menudo-fansub.com", "es", "/slide") diff --git a/multisrc/overrides/foolslide/nifteam/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/foolslide/nifteam/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..a05cc0f76 Binary files /dev/null and b/multisrc/overrides/foolslide/nifteam/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/foolslide/nifteam/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/foolslide/nifteam/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..862c2ae51 Binary files /dev/null and b/multisrc/overrides/foolslide/nifteam/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/foolslide/nifteam/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/foolslide/nifteam/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..07ac1e389 Binary files /dev/null and b/multisrc/overrides/foolslide/nifteam/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/foolslide/nifteam/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/foolslide/nifteam/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..7bbcece07 Binary files /dev/null and b/multisrc/overrides/foolslide/nifteam/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/foolslide/nifteam/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/foolslide/nifteam/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..d7c0cd649 Binary files /dev/null and b/multisrc/overrides/foolslide/nifteam/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/foolslide/nifteam/src/NIFTeam.kt b/multisrc/overrides/foolslide/nifteam/src/NIFTeam.kt new file mode 100644 index 000000000..a6e9d67cb --- /dev/null +++ b/multisrc/overrides/foolslide/nifteam/src/NIFTeam.kt @@ -0,0 +1,5 @@ +package eu.kanade.tachiyomi.extension.it.nifteam + +import eu.kanade.tachiyomi.multisrc.foolslide.FoolSlide + +class NIFTeam : FoolSlide("NIFTeam", "http://read-nifteam.info", "it", "/slide") diff --git a/multisrc/overrides/foolslide/rama/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/foolslide/rama/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..ebcb903bb Binary files /dev/null and b/multisrc/overrides/foolslide/rama/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/foolslide/rama/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/foolslide/rama/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..a0299e799 Binary files /dev/null and b/multisrc/overrides/foolslide/rama/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/foolslide/rama/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/foolslide/rama/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..a6d23a009 Binary files /dev/null and b/multisrc/overrides/foolslide/rama/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/foolslide/rama/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/foolslide/rama/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..3e9ff0d56 Binary files /dev/null and b/multisrc/overrides/foolslide/rama/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/foolslide/rama/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/foolslide/rama/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..ee63ad2bb Binary files /dev/null and b/multisrc/overrides/foolslide/rama/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/foolslide/rama/src/Rama.kt b/multisrc/overrides/foolslide/rama/src/Rama.kt new file mode 100644 index 000000000..505204490 --- /dev/null +++ b/multisrc/overrides/foolslide/rama/src/Rama.kt @@ -0,0 +1,5 @@ +package eu.kanade.tachiyomi.extension.it.rama + +import eu.kanade.tachiyomi.multisrc.foolslide.FoolSlide + +class Rama : FoolSlide("Rama", "https://www.ramareader.it", "it", "/read") diff --git a/multisrc/overrides/foolslide/silentsky/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/foolslide/silentsky/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..e7e1874b9 Binary files /dev/null and b/multisrc/overrides/foolslide/silentsky/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/foolslide/silentsky/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/foolslide/silentsky/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..924ba38c1 Binary files /dev/null and b/multisrc/overrides/foolslide/silentsky/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/foolslide/silentsky/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/foolslide/silentsky/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..cf6b71cfd Binary files /dev/null and b/multisrc/overrides/foolslide/silentsky/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/foolslide/silentsky/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/foolslide/silentsky/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..b6279e3d6 Binary files /dev/null and b/multisrc/overrides/foolslide/silentsky/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/foolslide/silentsky/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/foolslide/silentsky/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..3e1363c06 Binary files /dev/null and b/multisrc/overrides/foolslide/silentsky/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gattsu/default/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/gattsu/default/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..719f2d5cd Binary files /dev/null and b/multisrc/overrides/gattsu/default/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gattsu/default/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/gattsu/default/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..038bca431 Binary files /dev/null and b/multisrc/overrides/gattsu/default/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gattsu/default/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/gattsu/default/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..cf3e9d703 Binary files /dev/null and b/multisrc/overrides/gattsu/default/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gattsu/default/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/gattsu/default/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..d6d617c10 Binary files /dev/null and b/multisrc/overrides/gattsu/default/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gattsu/default/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/gattsu/default/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..959bd60d9 Binary files /dev/null and b/multisrc/overrides/gattsu/default/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gattsu/hentaiseason/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/gattsu/hentaiseason/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..872ad3814 Binary files /dev/null and b/multisrc/overrides/gattsu/hentaiseason/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gattsu/hentaiseason/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/gattsu/hentaiseason/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..db2a56ff3 Binary files /dev/null and b/multisrc/overrides/gattsu/hentaiseason/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gattsu/hentaiseason/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/gattsu/hentaiseason/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..a604638a0 Binary files /dev/null and b/multisrc/overrides/gattsu/hentaiseason/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gattsu/hentaiseason/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/gattsu/hentaiseason/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..d438d4503 Binary files /dev/null and b/multisrc/overrides/gattsu/hentaiseason/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gattsu/hentaiseason/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/gattsu/hentaiseason/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..56487fa09 Binary files /dev/null and b/multisrc/overrides/gattsu/hentaiseason/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gattsu/hentaiseason/src/HentaiSeason.kt b/multisrc/overrides/gattsu/hentaiseason/src/HentaiSeason.kt new file mode 100644 index 000000000..eb601f2ac --- /dev/null +++ b/multisrc/overrides/gattsu/hentaiseason/src/HentaiSeason.kt @@ -0,0 +1,17 @@ +package eu.kanade.tachiyomi.extension.pt.hentaiseason + +import eu.kanade.tachiyomi.multisrc.gattsu.Gattsu +import eu.kanade.tachiyomi.network.interceptor.rateLimit +import okhttp3.OkHttpClient +import java.util.concurrent.TimeUnit + +class HentaiSeason : Gattsu( + "Hentai Season", + "https://hentaiseason.com", + "pt-BR", +) { + + override val client: OkHttpClient = super.client.newBuilder() + .rateLimit(1, 2, TimeUnit.SECONDS) + .build() +} diff --git a/multisrc/overrides/gattsu/hentaitokyo/src/HentaiTokyo.kt b/multisrc/overrides/gattsu/hentaitokyo/src/HentaiTokyo.kt new file mode 100644 index 000000000..dc05bb595 --- /dev/null +++ b/multisrc/overrides/gattsu/hentaitokyo/src/HentaiTokyo.kt @@ -0,0 +1,17 @@ +package eu.kanade.tachiyomi.extension.pt.hentaitokyo + +import eu.kanade.tachiyomi.multisrc.gattsu.Gattsu +import eu.kanade.tachiyomi.network.interceptor.rateLimit +import okhttp3.OkHttpClient +import java.util.concurrent.TimeUnit + +class HentaiTokyo : Gattsu( + "Hentai Tokyo", + "https://hentaitokyo.net", + "pt-BR", +) { + + override val client: OkHttpClient = super.client.newBuilder() + .rateLimit(1, 2, TimeUnit.SECONDS) + .build() +} diff --git a/multisrc/overrides/gattsu/universohentai/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/gattsu/universohentai/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..c1b123201 Binary files /dev/null and b/multisrc/overrides/gattsu/universohentai/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gattsu/universohentai/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/gattsu/universohentai/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..641fa93cb Binary files /dev/null and b/multisrc/overrides/gattsu/universohentai/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gattsu/universohentai/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/gattsu/universohentai/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..0612ac358 Binary files /dev/null and b/multisrc/overrides/gattsu/universohentai/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gattsu/universohentai/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/gattsu/universohentai/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..8175ce30f Binary files /dev/null and b/multisrc/overrides/gattsu/universohentai/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gattsu/universohentai/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/gattsu/universohentai/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..33c0d4b0a Binary files /dev/null and b/multisrc/overrides/gattsu/universohentai/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gattsu/universohentai/src/UniversoHentai.kt b/multisrc/overrides/gattsu/universohentai/src/UniversoHentai.kt new file mode 100644 index 000000000..a9d73e273 --- /dev/null +++ b/multisrc/overrides/gattsu/universohentai/src/UniversoHentai.kt @@ -0,0 +1,65 @@ +package eu.kanade.tachiyomi.extension.pt.universohentai + +import eu.kanade.tachiyomi.multisrc.gattsu.Gattsu +import eu.kanade.tachiyomi.network.interceptor.rateLimit +import eu.kanade.tachiyomi.source.model.SChapter +import eu.kanade.tachiyomi.source.model.SManga +import eu.kanade.tachiyomi.util.asJsoup +import okhttp3.OkHttpClient +import okhttp3.Response +import org.jsoup.nodes.Document +import org.jsoup.nodes.Element +import java.util.concurrent.TimeUnit + +class UniversoHentai : Gattsu( + "Universo Hentai", + "https://universohentai.com", + "pt-BR", +) { + + override val client: OkHttpClient = super.client.newBuilder() + .rateLimit(1, 2, TimeUnit.SECONDS) + .build() + + override fun latestUpdatesSelector() = "div.meio div.videos div.video a[href^=$baseUrl]:not(:has(span.selo-hd))" + + override fun latestUpdatesFromElement(element: Element): SManga = SManga.create().apply { + title = element.selectFirst("span.video-titulo")!!.text().trim() + thumbnail_url = element.selectFirst("img.wp-post-image")!!.attr("src") + setUrlWithoutDomain(element.attr("href")) + } + + override fun mangaDetailsParse(document: Document): SManga = SManga.create().apply { + val postBox = document.selectFirst(chapterListSelector())!! + + title = postBox.select("h1.post-titulo").first()!!.text() + author = postBox.select("ul.paginaPostItens li:contains(Artista) a").firstOrNull()?.text() + genre = postBox.select("ul.paginaPostItens li:contains(Categorias) a") + .joinToString(", ") { it.text() } + status = SManga.COMPLETED + thumbnail_url = postBox.select("div.paginaPostThumb > img.wp-post-image") + .attr("src") + .withoutSize() + } + + override fun chapterListParse(response: Response): List { + val document = response.asJsoup() + + return document.select(chapterListSelector()) + .map { chapterFromElement(it) } + } + + override fun chapterListSelector() = "div.meio div.post[itemscope]:has(a[title=Abrir galeria])" + + override fun chapterFromElement(element: Element): SChapter = SChapter.create().apply { + name = "Capítulo único" + scanlator = element.select("ul.paginaPostItens li:contains(Tradutor) a").firstOrNull()?.text() + date_upload = element.ownerDocument()!!.select("meta[property=article:published_time]").firstOrNull() + ?.attr("content") + .orEmpty() + .toDate() + setUrlWithoutDomain(element.selectFirst("a[title=Abrir galeria]")!!.attr("href")) + } + + override fun pageListSelector() = "div.meio div.galeria div.galeria-foto a img" +} diff --git a/multisrc/overrides/gigaviewer/comicdays/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/gigaviewer/comicdays/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..b030d70c9 Binary files /dev/null and b/multisrc/overrides/gigaviewer/comicdays/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gigaviewer/comicdays/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/gigaviewer/comicdays/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..2630aab2d Binary files /dev/null and b/multisrc/overrides/gigaviewer/comicdays/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gigaviewer/comicdays/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/gigaviewer/comicdays/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..f9dc791e5 Binary files /dev/null and b/multisrc/overrides/gigaviewer/comicdays/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gigaviewer/comicdays/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/gigaviewer/comicdays/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..54d400e77 Binary files /dev/null and b/multisrc/overrides/gigaviewer/comicdays/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gigaviewer/comicdays/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/gigaviewer/comicdays/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..c60c9090a Binary files /dev/null and b/multisrc/overrides/gigaviewer/comicdays/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gigaviewer/comicdays/src/ComicDays.kt b/multisrc/overrides/gigaviewer/comicdays/src/ComicDays.kt new file mode 100644 index 000000000..c67d5adae --- /dev/null +++ b/multisrc/overrides/gigaviewer/comicdays/src/ComicDays.kt @@ -0,0 +1,35 @@ +package eu.kanade.tachiyomi.extension.ja.comicdays + +import eu.kanade.tachiyomi.multisrc.gigaviewer.GigaViewer +import eu.kanade.tachiyomi.source.model.SManga +import okhttp3.OkHttpClient +import org.jsoup.nodes.Element + +class ComicDays : GigaViewer( + "Comic Days", + "https://comic-days.com", + "ja", + "https://cdn-img.comic-days.com/public/page", +) { + + override val client: OkHttpClient = super.client.newBuilder() + .addInterceptor(::imageIntercept) + .build() + + override val publisher: String = "講談社" + + override fun popularMangaSelector(): String = "ul.daily-series li.daily-series-item:has(a.link)" + + override fun popularMangaFromElement(element: Element): SManga = SManga.create().apply { + title = element.selectFirst("h4.daily-series-title")!!.text() + thumbnail_url = element.selectFirst("div.daily-series-thumb img")!! + .attr("data-src") + setUrlWithoutDomain(element.selectFirst("a.link")!!.attr("href")) + } + + override fun latestUpdatesSelector(): String = "section#$dayOfWeek.daily " + popularMangaSelector() + + override fun getCollections(): List = listOf( + Collection("連載作品一覧", ""), + ) +} diff --git a/multisrc/overrides/gigaviewer/comicgardo/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/gigaviewer/comicgardo/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..25c644933 Binary files /dev/null and b/multisrc/overrides/gigaviewer/comicgardo/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gigaviewer/comicgardo/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/gigaviewer/comicgardo/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..512b5018b Binary files /dev/null and b/multisrc/overrides/gigaviewer/comicgardo/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gigaviewer/comicgardo/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/gigaviewer/comicgardo/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..b37db1951 Binary files /dev/null and b/multisrc/overrides/gigaviewer/comicgardo/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gigaviewer/comicgardo/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/gigaviewer/comicgardo/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..e65daae14 Binary files /dev/null and b/multisrc/overrides/gigaviewer/comicgardo/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gigaviewer/comicgardo/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/gigaviewer/comicgardo/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..dd01c5fa7 Binary files /dev/null and b/multisrc/overrides/gigaviewer/comicgardo/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gigaviewer/comicgardo/src/ComicGardo.kt b/multisrc/overrides/gigaviewer/comicgardo/src/ComicGardo.kt new file mode 100644 index 000000000..c1819ffcf --- /dev/null +++ b/multisrc/overrides/gigaviewer/comicgardo/src/ComicGardo.kt @@ -0,0 +1,34 @@ +package eu.kanade.tachiyomi.extension.ja.comicgardo + +import eu.kanade.tachiyomi.multisrc.gigaviewer.GigaViewer +import eu.kanade.tachiyomi.source.model.SManga +import okhttp3.OkHttpClient +import org.jsoup.nodes.Element + +class ComicGardo : GigaViewer( + "Comic Gardo", + "https://comic-gardo.com", + "ja", + "https://cdn-img.comic-gardo.com/public/page", +) { + + override val supportsLatest: Boolean = false + + override val client: OkHttpClient = super.client.newBuilder() + .addInterceptor(::imageIntercept) + .build() + + override val publisher: String = "オーバーラップ" + + override fun popularMangaSelector(): String = "ul.series-section-list li.series-section-item > a" + + override fun popularMangaFromElement(element: Element): SManga = SManga.create().apply { + title = element.selectFirst("h5.series-title")!!.text() + thumbnail_url = element.selectFirst("div.thumb img")!!.attr("data-src") + setUrlWithoutDomain(element.attr("href")!!) + } + + override fun getCollections(): List = listOf( + Collection("連載一覧", ""), + ) +} diff --git a/multisrc/overrides/gigaviewer/comiplex/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/gigaviewer/comiplex/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..2d169d46a Binary files /dev/null and b/multisrc/overrides/gigaviewer/comiplex/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gigaviewer/comiplex/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/gigaviewer/comiplex/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..f0486db50 Binary files /dev/null and b/multisrc/overrides/gigaviewer/comiplex/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gigaviewer/comiplex/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/gigaviewer/comiplex/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..45b63d67b Binary files /dev/null and b/multisrc/overrides/gigaviewer/comiplex/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gigaviewer/comiplex/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/gigaviewer/comiplex/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..e6ff5ed1f Binary files /dev/null and b/multisrc/overrides/gigaviewer/comiplex/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gigaviewer/comiplex/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/gigaviewer/comiplex/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..4ddc9bff6 Binary files /dev/null and b/multisrc/overrides/gigaviewer/comiplex/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gigaviewer/comiplex/src/Comiplex.kt b/multisrc/overrides/gigaviewer/comiplex/src/Comiplex.kt new file mode 100644 index 000000000..c19846f9d --- /dev/null +++ b/multisrc/overrides/gigaviewer/comiplex/src/Comiplex.kt @@ -0,0 +1,42 @@ +package eu.kanade.tachiyomi.extension.ja.comiplex + +import eu.kanade.tachiyomi.multisrc.gigaviewer.GigaViewer +import eu.kanade.tachiyomi.network.GET +import eu.kanade.tachiyomi.source.model.SManga +import okhttp3.OkHttpClient +import okhttp3.Request +import org.jsoup.nodes.Element + +class Comiplex : GigaViewer( + "Comiplex", + "https://viewer.heros-web.com", + "ja", + "https://cdn-img.viewer.heros-web.com/public/page", +) { + + override val supportsLatest: Boolean = false + + override val client: OkHttpClient = super.client.newBuilder() + .addInterceptor(::imageIntercept) + .build() + + override val publisher: String = "ヒーローズ" + + override fun popularMangaRequest(page: Int): Request = GET("$baseUrl/series/heros", headers) + + override fun popularMangaSelector(): String = "ul.series-items li.series-item > a" + + override fun popularMangaFromElement(element: Element): SManga = SManga.create().apply { + title = element.selectFirst("h4.item-series-title")!!.text() + thumbnail_url = element.selectFirst("div.series-item-thumb img")!! + .attr("data-src") + setUrlWithoutDomain(element.attr("href")) + } + + override fun getCollections(): List = listOf( + Collection("ヒーローズ", "heros"), + Collection("ふらっとヒーローズ", "flat"), + Collection("わいるどヒーローズ", "wild"), + Collection("読切作品", "oneshot"), + ) +} diff --git a/multisrc/overrides/gigaviewer/corocoroonline/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/gigaviewer/corocoroonline/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..c3cd570f3 Binary files /dev/null and b/multisrc/overrides/gigaviewer/corocoroonline/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gigaviewer/corocoroonline/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/gigaviewer/corocoroonline/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..49ba3efdb Binary files /dev/null and b/multisrc/overrides/gigaviewer/corocoroonline/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gigaviewer/corocoroonline/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/gigaviewer/corocoroonline/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..ca8d65936 Binary files /dev/null and b/multisrc/overrides/gigaviewer/corocoroonline/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gigaviewer/corocoroonline/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/gigaviewer/corocoroonline/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..73eff6e66 Binary files /dev/null and b/multisrc/overrides/gigaviewer/corocoroonline/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gigaviewer/corocoroonline/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/gigaviewer/corocoroonline/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..f9eb54002 Binary files /dev/null and b/multisrc/overrides/gigaviewer/corocoroonline/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gigaviewer/corocoroonline/src/CorocoroOnline.kt b/multisrc/overrides/gigaviewer/corocoroonline/src/CorocoroOnline.kt new file mode 100644 index 000000000..be576e20e --- /dev/null +++ b/multisrc/overrides/gigaviewer/corocoroonline/src/CorocoroOnline.kt @@ -0,0 +1,72 @@ +package eu.kanade.tachiyomi.extension.ja.corocoroonline + +import eu.kanade.tachiyomi.multisrc.gigaviewer.GigaViewer +import eu.kanade.tachiyomi.network.GET +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 okhttp3.OkHttpClient +import okhttp3.Request +import org.jsoup.nodes.Element +import rx.Observable + +class CorocoroOnline : GigaViewer( + "Corocoro Online", + "https://corocoro.jp", + "ja", + "https://cdn-img.www.corocoro.jp/public/page", +) { + + override val supportsLatest: Boolean = false + + override val client: OkHttpClient = super.client.newBuilder() + .addInterceptor(::imageIntercept) + .build() + + override val publisher = "小学館" + + override fun popularMangaRequest(page: Int): Request = GET("$baseUrl/manga", headers) + + override fun popularMangaSelector(): String = "a.p-article-wrap" + + override fun popularMangaFromElement(element: Element): SManga = SManga.create().apply { + title = element.selectFirst("h3.p-article-title")!!.text() + .substringAfter(']') + thumbnail_url = element.selectFirst("> .p-article-image > img")!!.attr("src") + setUrlWithoutDomain(element.attr("href")) + } + + // Site doesn't have a manga search and only returns news in search results. + override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable { + return fetchPopularManga(page) + .map { allManga -> + val filteredManga = allManga.mangas.filter { manga -> + manga.title.contains(query, true) + } + + MangasPage(filteredManga, hasNextPage = false) + } + } + + // The chapters only load using the URL with 'www'. + override fun mangaDetailsRequest(manga: SManga): Request = + GET(BASE_URL_WWW + manga.url, headers) + + override fun chapterListRequest(manga: SManga): Request = mangaDetailsRequest(manga) + + override fun pageListRequest(chapter: SChapter): Request = + GET(BASE_URL_WWW + chapter.url, headers) + + // All chapters seems to be free. + override fun chapterListSelector(): String = "li.episode" + + override val chapterListMode = CHAPTER_LIST_LOCKED + + // The source have no collections, so no need to have filters. + override fun getFilterList(): FilterList = FilterList() + + companion object { + private const val BASE_URL_WWW = "https://www.corocoro.jp" + } +} diff --git a/multisrc/overrides/gigaviewer/default/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/gigaviewer/default/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..f14743bb8 Binary files /dev/null and b/multisrc/overrides/gigaviewer/default/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gigaviewer/default/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/gigaviewer/default/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..e46ce03bf Binary files /dev/null and b/multisrc/overrides/gigaviewer/default/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gigaviewer/default/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/gigaviewer/default/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..e28ccdb5d Binary files /dev/null and b/multisrc/overrides/gigaviewer/default/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gigaviewer/default/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/gigaviewer/default/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..7b752dc55 Binary files /dev/null and b/multisrc/overrides/gigaviewer/default/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gigaviewer/default/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/gigaviewer/default/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..9f8fdb738 Binary files /dev/null and b/multisrc/overrides/gigaviewer/default/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gigaviewer/kuragebunch/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/gigaviewer/kuragebunch/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..541af8ac8 Binary files /dev/null and b/multisrc/overrides/gigaviewer/kuragebunch/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gigaviewer/kuragebunch/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/gigaviewer/kuragebunch/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..f1c8971a1 Binary files /dev/null and b/multisrc/overrides/gigaviewer/kuragebunch/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gigaviewer/kuragebunch/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/gigaviewer/kuragebunch/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..fab9b1003 Binary files /dev/null and b/multisrc/overrides/gigaviewer/kuragebunch/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gigaviewer/kuragebunch/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/gigaviewer/kuragebunch/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..ee954b550 Binary files /dev/null and b/multisrc/overrides/gigaviewer/kuragebunch/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gigaviewer/kuragebunch/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/gigaviewer/kuragebunch/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..008726b79 Binary files /dev/null and b/multisrc/overrides/gigaviewer/kuragebunch/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gigaviewer/kuragebunch/src/KurageBunch.kt b/multisrc/overrides/gigaviewer/kuragebunch/src/KurageBunch.kt new file mode 100644 index 000000000..6e8a56ac2 --- /dev/null +++ b/multisrc/overrides/gigaviewer/kuragebunch/src/KurageBunch.kt @@ -0,0 +1,44 @@ +package eu.kanade.tachiyomi.extension.ja.kuragebunch + +import eu.kanade.tachiyomi.multisrc.gigaviewer.GigaViewer +import eu.kanade.tachiyomi.network.GET +import eu.kanade.tachiyomi.source.model.SManga +import okhttp3.OkHttpClient +import okhttp3.Request +import org.jsoup.nodes.Element + +class KurageBunch : GigaViewer( + "Kurage Bunch", + "https://kuragebunch.com", + "ja", + "https://cdn-img.kuragebunch.com", +) { + + override val supportsLatest: Boolean = false + + override val client: OkHttpClient = super.client.newBuilder() + .addInterceptor(::imageIntercept) + .build() + + override val publisher: String = "株式会社" + + override fun popularMangaRequest(page: Int): Request = GET("$baseUrl/series/kuragebunch", headers) + + override fun popularMangaSelector(): String = "ul.page-series-list li div.item-box" + + override fun popularMangaFromElement(element: Element): SManga = SManga.create().apply { + title = element.selectFirst("a.series-data-container h4")!!.text() + thumbnail_url = element.selectFirst("a.series-thumb img")!!.attr("data-src") + setUrlWithoutDomain(element.selectFirst("a")!!.attr("href")) + } + + override fun chapterListSelector(): String = "li.episode" + + override fun getCollections(): List = listOf( + Collection("くらげバンチ", "kuragebunch"), + Collection("読切", "oneshot"), + Collection("月刊コミックバンチ", "comicbunch"), + Collection("Bバンチ", "bbunch"), + Collection("ututu", "ututu"), + ) +} diff --git a/multisrc/overrides/gigaviewer/magazinepocket/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/gigaviewer/magazinepocket/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..71b561beb Binary files /dev/null and b/multisrc/overrides/gigaviewer/magazinepocket/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gigaviewer/magazinepocket/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/gigaviewer/magazinepocket/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..cda8755b7 Binary files /dev/null and b/multisrc/overrides/gigaviewer/magazinepocket/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gigaviewer/magazinepocket/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/gigaviewer/magazinepocket/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..095694514 Binary files /dev/null and b/multisrc/overrides/gigaviewer/magazinepocket/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gigaviewer/magazinepocket/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/gigaviewer/magazinepocket/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..91dd77058 Binary files /dev/null and b/multisrc/overrides/gigaviewer/magazinepocket/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gigaviewer/magazinepocket/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/gigaviewer/magazinepocket/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..8424d2dc4 Binary files /dev/null and b/multisrc/overrides/gigaviewer/magazinepocket/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gigaviewer/magazinepocket/src/MagazinePocket.kt b/multisrc/overrides/gigaviewer/magazinepocket/src/MagazinePocket.kt new file mode 100644 index 000000000..581ae2733 --- /dev/null +++ b/multisrc/overrides/gigaviewer/magazinepocket/src/MagazinePocket.kt @@ -0,0 +1,36 @@ +package eu.kanade.tachiyomi.extension.ja.magazinepocket + +import eu.kanade.tachiyomi.multisrc.gigaviewer.GigaViewer +import eu.kanade.tachiyomi.source.model.SManga +import okhttp3.OkHttpClient +import org.jsoup.nodes.Element + +class MagazinePocket : GigaViewer( + "Magazine Pocket", + "https://pocket.shonenmagazine.com", + "ja", + "https://cdn-img.pocket.shonenmagazine.com/public/page", +) { + + override val client: OkHttpClient = super.client.newBuilder() + .addInterceptor(::imageIntercept) + .build() + + override val publisher: String = "講談社" + + override fun popularMangaSelector(): String = "ul.daily-series li.daily-series-item > a" + + override fun popularMangaFromElement(element: Element): SManga = SManga.create().apply { + title = element.selectFirst("h4.daily-series-title")!!.text() + thumbnail_url = element.selectFirst("div.daily-series-thumb img")!!.attr("data-src") + setUrlWithoutDomain(element.attr("href")!!) + } + + override fun latestUpdatesSelector(): String = "section.daily.$dayOfWeek " + popularMangaSelector() + + override fun getCollections(): List = listOf( + Collection("マガポケ連載一覧", ""), + Collection("週刊少年マガジン連載一覧", "smaga"), + Collection("別冊少年マガジン連載一覧", "bmaga"), + ) +} diff --git a/multisrc/overrides/gigaviewer/magcomi/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/gigaviewer/magcomi/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..ddbdb3bfa Binary files /dev/null and b/multisrc/overrides/gigaviewer/magcomi/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gigaviewer/magcomi/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/gigaviewer/magcomi/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..32b1ac437 Binary files /dev/null and b/multisrc/overrides/gigaviewer/magcomi/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gigaviewer/magcomi/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/gigaviewer/magcomi/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..44e899370 Binary files /dev/null and b/multisrc/overrides/gigaviewer/magcomi/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gigaviewer/magcomi/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/gigaviewer/magcomi/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..a0e87bfeb Binary files /dev/null and b/multisrc/overrides/gigaviewer/magcomi/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gigaviewer/magcomi/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/gigaviewer/magcomi/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..4dc7d16f1 Binary files /dev/null and b/multisrc/overrides/gigaviewer/magcomi/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gigaviewer/magcomi/src/MagComi.kt b/multisrc/overrides/gigaviewer/magcomi/src/MagComi.kt new file mode 100644 index 000000000..c17207e4d --- /dev/null +++ b/multisrc/overrides/gigaviewer/magcomi/src/MagComi.kt @@ -0,0 +1,34 @@ +package eu.kanade.tachiyomi.extension.ja.magcomi + +import eu.kanade.tachiyomi.multisrc.gigaviewer.GigaViewer +import eu.kanade.tachiyomi.source.model.SManga +import okhttp3.OkHttpClient +import org.jsoup.nodes.Element + +class MagComi : GigaViewer( + "MAGCOMI", + "https://magcomi.com", + "ja", + "https://cdn-img.magcomi.com/public/page", +) { + + override val supportsLatest: Boolean = false + + override val client: OkHttpClient = super.client.newBuilder() + .addInterceptor(::imageIntercept) + .build() + + override val publisher: String = "マッグガーデン" + + override fun popularMangaSelector(): String = "ul.magcomi-series-list li.series-item > a" + + override fun popularMangaFromElement(element: Element): SManga = SManga.create().apply { + title = element.select("h3.series-title").text() + thumbnail_url = element.select("div.series-thumb img").attr("src") + setUrlWithoutDomain(element.attr("href")) + } + + override fun getCollections(): List = listOf( + Collection("連載・読切", ""), + ) +} diff --git a/multisrc/overrides/gigaviewer/shonenjumpplus/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/gigaviewer/shonenjumpplus/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..46d908d23 Binary files /dev/null and b/multisrc/overrides/gigaviewer/shonenjumpplus/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gigaviewer/shonenjumpplus/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/gigaviewer/shonenjumpplus/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..1b5829133 Binary files /dev/null and b/multisrc/overrides/gigaviewer/shonenjumpplus/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gigaviewer/shonenjumpplus/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/gigaviewer/shonenjumpplus/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..eb3eb16da Binary files /dev/null and b/multisrc/overrides/gigaviewer/shonenjumpplus/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gigaviewer/shonenjumpplus/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/gigaviewer/shonenjumpplus/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..fbe22f77b Binary files /dev/null and b/multisrc/overrides/gigaviewer/shonenjumpplus/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gigaviewer/shonenjumpplus/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/gigaviewer/shonenjumpplus/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..b7b07b121 Binary files /dev/null and b/multisrc/overrides/gigaviewer/shonenjumpplus/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gigaviewer/shonenjumpplus/src/ShonenJumpPlus.kt b/multisrc/overrides/gigaviewer/shonenjumpplus/src/ShonenJumpPlus.kt new file mode 100644 index 000000000..c34222abb --- /dev/null +++ b/multisrc/overrides/gigaviewer/shonenjumpplus/src/ShonenJumpPlus.kt @@ -0,0 +1,24 @@ +package eu.kanade.tachiyomi.extension.ja.shonenjumpplus + +import eu.kanade.tachiyomi.multisrc.gigaviewer.GigaViewer +import okhttp3.OkHttpClient + +class ShonenJumpPlus : GigaViewer( + "Shonen Jump+", + "https://shonenjumpplus.com", + "ja", + "https://cdn-ak-img.shonenjumpplus.com", +) { + + override val client: OkHttpClient = super.client.newBuilder() + .addInterceptor(::imageIntercept) + .build() + + override val publisher: String = "集英社" + + override fun getCollections(): List = listOf( + Collection("ジャンプ+連載一覧", ""), + Collection("ジャンプ+読切シリーズ", "oneshot"), + Collection("連載終了作品", "finished"), + ) +} diff --git a/multisrc/overrides/gigaviewer/sundaywebevery/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/gigaviewer/sundaywebevery/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..f504dae0a Binary files /dev/null and b/multisrc/overrides/gigaviewer/sundaywebevery/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gigaviewer/sundaywebevery/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/gigaviewer/sundaywebevery/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..85523db09 Binary files /dev/null and b/multisrc/overrides/gigaviewer/sundaywebevery/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gigaviewer/sundaywebevery/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/gigaviewer/sundaywebevery/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..58b710261 Binary files /dev/null and b/multisrc/overrides/gigaviewer/sundaywebevery/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gigaviewer/sundaywebevery/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/gigaviewer/sundaywebevery/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..5345814d8 Binary files /dev/null and b/multisrc/overrides/gigaviewer/sundaywebevery/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gigaviewer/sundaywebevery/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/gigaviewer/sundaywebevery/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..353165ac3 Binary files /dev/null and b/multisrc/overrides/gigaviewer/sundaywebevery/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gigaviewer/sundaywebevery/src/SundayWebEvery.kt b/multisrc/overrides/gigaviewer/sundaywebevery/src/SundayWebEvery.kt new file mode 100644 index 000000000..a8d5fea94 --- /dev/null +++ b/multisrc/overrides/gigaviewer/sundaywebevery/src/SundayWebEvery.kt @@ -0,0 +1,38 @@ +package eu.kanade.tachiyomi.extension.ja.sundaywebevery + +import eu.kanade.tachiyomi.multisrc.gigaviewer.GigaViewer +import eu.kanade.tachiyomi.source.model.SManga +import okhttp3.OkHttpClient +import org.jsoup.nodes.Element + +class SundayWebEvery : GigaViewer( + "Sunday Web Every", + "https://www.sunday-webry.com", + "ja", + "https://cdn-img.www.sunday-webry.com/public/page", +) { + + override val client: OkHttpClient = super.client.newBuilder() + .addInterceptor(::imageIntercept) + .build() + + override val publisher: String = "小学館" + + override fun popularMangaSelector(): String = "ul.webry-series-list li a.webry-series-item-link" + + override fun popularMangaFromElement(element: Element): SManga = SManga.create().apply { + title = element.selectFirst("h4.series-title")!!.text() + thumbnail_url = element.selectFirst("div.thumb-wrapper img")!!.attr("data-src") + setUrlWithoutDomain(element.attr("href")) + } + + override fun latestUpdatesSelector(): String = "h3#series-$dayOfWeek + section " + popularMangaSelector() + + override val chapterListMode = CHAPTER_LIST_LOCKED + + override fun getCollections(): List = listOf( + Collection("連載作品", ""), + Collection("読切", "oneshot"), + Collection("夜サンデー", "yoru-sunday"), + ) +} diff --git a/multisrc/overrides/gigaviewer/tonarinoyoungjump/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/gigaviewer/tonarinoyoungjump/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..a54cd5ad6 Binary files /dev/null and b/multisrc/overrides/gigaviewer/tonarinoyoungjump/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gigaviewer/tonarinoyoungjump/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/gigaviewer/tonarinoyoungjump/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..5dfd28141 Binary files /dev/null and b/multisrc/overrides/gigaviewer/tonarinoyoungjump/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gigaviewer/tonarinoyoungjump/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/gigaviewer/tonarinoyoungjump/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..0b4fd4cc8 Binary files /dev/null and b/multisrc/overrides/gigaviewer/tonarinoyoungjump/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gigaviewer/tonarinoyoungjump/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/gigaviewer/tonarinoyoungjump/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..cb3a5a64e Binary files /dev/null and b/multisrc/overrides/gigaviewer/tonarinoyoungjump/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gigaviewer/tonarinoyoungjump/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/gigaviewer/tonarinoyoungjump/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..81136b36d Binary files /dev/null and b/multisrc/overrides/gigaviewer/tonarinoyoungjump/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/gigaviewer/tonarinoyoungjump/src/TonariNoYoungJump.kt b/multisrc/overrides/gigaviewer/tonarinoyoungjump/src/TonariNoYoungJump.kt new file mode 100644 index 000000000..f482e30b2 --- /dev/null +++ b/multisrc/overrides/gigaviewer/tonarinoyoungjump/src/TonariNoYoungJump.kt @@ -0,0 +1,40 @@ +package eu.kanade.tachiyomi.extension.ja.tonarinoyoungjump + +import eu.kanade.tachiyomi.multisrc.gigaviewer.GigaViewer +import eu.kanade.tachiyomi.source.model.SManga +import okhttp3.OkHttpClient +import org.jsoup.nodes.Element + +class TonariNoYoungJump : GigaViewer( + "Tonari no Young Jump", + "https://tonarinoyj.jp", + "ja", + "https://cdn-img.tonarinoyj.jp/public/page", +) { + + override val supportsLatest: Boolean = false + + override val client: OkHttpClient = super.client.newBuilder() + .addInterceptor(::imageIntercept) + .build() + + override val publisher: String = "集英社" + + override fun popularMangaSelector(): String = "ul.series-table-list li.subpage-table-list-item > a" + + override fun popularMangaFromElement(element: Element): SManga = SManga.create().apply { + title = element.selectFirst("h4.title")!!.text() + thumbnail_url = element.selectFirst("div.subpage-image-wrapper img")!!.attr("data-src") + .replace("{width}", "528") + .replace("{height}", "528") + setUrlWithoutDomain(element.attr("href")) + } + + override val chapterListMode = CHAPTER_LIST_LOCKED + + override fun getCollections(): List = listOf( + Collection("連載中", ""), + Collection("読切", "oneshot"), + Collection("出張作品", "trial"), + ) +} diff --git a/multisrc/overrides/grouple/allhentai/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/grouple/allhentai/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..d7626a6f9 Binary files /dev/null and b/multisrc/overrides/grouple/allhentai/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/grouple/allhentai/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/grouple/allhentai/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..016fbc954 Binary files /dev/null and b/multisrc/overrides/grouple/allhentai/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/grouple/allhentai/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/grouple/allhentai/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..d2d35dd5b Binary files /dev/null and b/multisrc/overrides/grouple/allhentai/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/grouple/allhentai/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/grouple/allhentai/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..ff4efdd56 Binary files /dev/null and b/multisrc/overrides/grouple/allhentai/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/grouple/allhentai/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/grouple/allhentai/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..541d18e42 Binary files /dev/null and b/multisrc/overrides/grouple/allhentai/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/grouple/allhentai/src/AllHentai.kt b/multisrc/overrides/grouple/allhentai/src/AllHentai.kt new file mode 100644 index 000000000..66b285000 --- /dev/null +++ b/multisrc/overrides/grouple/allhentai/src/AllHentai.kt @@ -0,0 +1,297 @@ +package eu.kanade.tachiyomi.extension.ru.allhentai + +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 AllHentai : GroupLe("AllHentai", "https://z.allhen.online", "ru") { + + override val id: Long = 1809051393403180443 + + 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() else filters).forEach { filter -> + when (filter) { + is GenreList -> filter.state.forEach { genre -> + if (genre.state != Filter.TriState.STATE_IGNORE) { + url.addQueryParameter(genre.id, arrayOf("=", "=in", "=ex")[genre.state]) + } + } + is Category -> filter.state.forEach { category -> + if (category.state != Filter.TriState.STATE_IGNORE) { + url.addQueryParameter(category.id, arrayOf("=", "=in", "=ex")[category.state]) + } + } + is FilList -> filter.state.forEach { fils -> + if (fils.state != Filter.TriState.STATE_IGNORE) { + url.addQueryParameter(fils.id, arrayOf("=", "=in", "=ex")[fils.state]) + } + } + is OrderBy -> { + if (filter.state > 0) { + val ord = arrayOf("not", "year", "rate", "popularity", "votes", "created", "updated")[filter.state] + val ordUrl = "$baseUrl/list?sortType=$ord&offset=${70 * (page - 1)}".toHttpUrlOrNull()!!.newBuilder() + return GET(ordUrl.toString(), headers) + } + } + is Tags -> { + if (filter.state > 0) { + val tagName = getTagsList()[filter.state].url + val tagUrl = "$baseUrl/list/tag/$tagName?offset=${70 * (page - 1)}".toHttpUrlOrNull()!!.newBuilder() + return GET(tagUrl.toString(), headers) + } + } + else -> {} + } + } + return if (url.toString().contains("&")) { + GET(url.toString().replace("=%3D", "="), headers) + } else { + popularMangaRequest(page) + } + } + + private class OrderBy : Filter.Select( + "Сортировка (только)", + arrayOf("Без сортировки", "По году", "По популярности", "Популярно сейчас", "По рейтингу", "Новинки", "По дате обновления"), + ) + + private class Genre(name: String, val id: String) : Filter.TriState(name) + + private class GenreList(genres: List) : Filter.Group("Жанры", genres) + private class Category(categories: List) : Filter.Group("Категории", categories) + private class FilList(fils: List) : Filter.Group("Фильтры", fils) + private class Tags(tags: Array) : Filter.Select("Тэг (только)", tags) + + private data class Tag(val name: String, val url: String) + + override fun getFilterList() = FilterList( + OrderBy(), + Tags(tagsName), + GenreList(getGenreList()), + Category(getCategoryList()), + FilList(getFilList()), + ) + + private fun getGenreList() = listOf( + Genre("ahegao", "el_855"), + Genre("анал", "el_828"), + Genre("бдсм", "el_78"), + Genre("без цензуры", "el_888"), + Genre("большая грудь", "el_837"), + Genre("большая попка", "el_3156"), + Genre("большой член", "el_884"), + Genre("бондаж", "el_5754"), + Genre("в первый раз", "el_811"), + Genre("в цвете", "el_290"), + Genre("гарем", "el_87"), + Genre("гендарная интрига", "el_89"), + Genre("групповой секс", "el_88"), + Genre("драма", "el_95"), + Genre("зрелые женщины", "el_5679"), + Genre("измена", "el_291"), + Genre("изнасилование", "el_124"), + Genre("инцест", "el_85"), + Genre("исторический", "el_93"), + Genre("комедия", "el_73"), + Genre("маленькая грудь", "el_870"), + Genre("научная фантастика", "el_76"), + Genre("нетораре", "el_303"), + Genre("оральный секс", "el_853"), + Genre("романтика", "el_74"), + Genre("тентакли", "el_69"), + Genre("трагедия", "el_1321"), + Genre("ужасы", "el_75"), + Genre("футанари", "el_77"), + Genre("фэнтези", "el_70"), + Genre("чикан", "el_1059"), + Genre("этти", "el_798"), + Genre("юри", "el_84"), + Genre("яой", "el_83"), + ) + + private fun getCategoryList() = listOf( + Genre("3D", "el_626"), + Genre("Анимация", "el_5777"), + Genre("Без текста", "el_3157"), + Genre("Порно комикс", "el_1003"), + Genre("Порно манхва", "el_1104"), + ) + + private fun getFilList() = listOf( + Genre("Высокий рейтинг", "s_high_rate"), + Genre("Сингл", "s_single"), + Genre("Для взрослых", "s_mature"), + Genre("Завершенная", "s_completed"), + Genre("Переведено", "s_translated"), + Genre("Длинная", "s_many_chapters"), + Genre("Ожидает загрузки", "s_wait_upload"), + Genre("Продается", "s_sale"), + ) + + private fun getTagsList() = listOf( + Tag("Без тега", "not"), + Tag("handjob", "handjob"), + Tag("inseki", "inseki"), + Tag("алкоголь", "alcohol"), + Tag("андроид", "android"), + Tag("анилингус", "anilingus"), + Tag("бассейн", "pool"), + Tag("без трусиков", "without_panties"), + Tag("беременность", "pregnancy"), + Tag("бикини", "bikini"), + Tag("близнецы", "twins"), + Tag("боди-арт", "body_art"), + Tag("больница", "hospital"), + Tag("буккакэ", "bukkake"), + Tag("в ванной", "in_bathroom"), + Tag("в общественном месте", "in_public_place"), + Tag("в транспорте", "in_vehicle"), + Tag("вампиры", "vampires"), + Tag("вибратор", "vibrator"), + Tag("втянутые соски", "inverted_nipples"), + Tag("гипноз", "hypnosis"), + Tag("глубокий минет", "deepthroat"), + Tag("горничные", "maids"), + Tag("горячий источник", "hot_spring"), + Tag("гэнгбэнг", "gangbang"), + Tag("гяру", "gyaru"), + Tag("двойное проникновение", "double_penetration"), + Tag("Девочки волшебницы", "magical_girl"), + Tag("демоны", "demons"), + Tag("дефекация", "scat"), + Tag("дилдо", "dildo"), + Tag("додзинси", "doujinshi"), + Tag("домохозяйки", "housewives"), + Tag("дыра в стене", "hole_in_the_wall"), + Tag("жестокость", "cruelty"), + Tag("загар", "tan_lines"), + Tag("зомби", "zombie"), + Tag("инопланетяне", "aliens"), + Tag("исполнение желаний", "granting_wish"), + Tag("камера", "camera"), + Tag("косплей", "cosplay"), + Tag("кремпай", "creampie"), + Tag("куннилингус", "cunnilingus"), + Tag("купальник", "swimsuit"), + Tag("лактация", "lactation"), + Tag("латекс и кожа", "latex"), + Tag("Ломка Психики", "mind_break"), + Tag("магия", "magic"), + Tag("мастурбация", "masturbation"), + Tag("медсестра", "nurse"), + Tag("мерзкий дядька", "terrible_oyaji"), + Tag("много девушек", "many_girls"), + Tag("много спермы", "a_lot_of_sperm"), + Tag("монстрдевушки", "monstergirl"), + Tag("монстры", "monsters"), + Tag("мужчина крепкого телосложения", "muscle_man"), + Tag("на природе", "outside"), + Tag("не бритая киска", "hairy_pussy"), + Tag("не бритые подмышки", "hairy_armpits"), + Tag("нетори", "netori"), + Tag("нижнее бельё", "lingerie"), + Tag("обмен партнерами", "swinging"), + Tag("обмен телами", "body_swap"), + Tag("обычный секс", "normal_sex"), + Tag("огромная грудь", "super_big_boobs"), + Tag("орки", "orcs"), + Tag("очки", "megane"), + Tag("пайзури", "titsfuck"), + Tag("парень пассив", "passive_guy"), + Tag("пацанка", "tomboy"), + Tag("пеггинг", "pegging"), + Tag("переодевание", "disguise"), + Tag("пирсинг", "piercing"), + Tag("писают", "peeing"), + Tag("пляж", "beach"), + Tag("повседневность", "slice_of_life"), + Tag("повязка на глаза", "blindfold"), + Tag("подглядывание", "peeping"), + Tag("подчинение", "submission"), + Tag("похищение", "kidnapping"), + Tag("принуждение", "forced"), + Tag("прозрачная одежда", "transparent_clothes"), + Tag("проституция", "prostitution"), + Tag("психические отклонения", "mental_illness"), + Tag("публичный секс", "public_sex"), + Tag("пьяные", "drunk"), + Tag("рабы", "slaves"), + Tag("рентген зрение", "x_ray"), + Tag("сверхъестественное", "supernatural"), + Tag("секс втроем", "threesome"), + Tag("секс игрушки", "sex_toys"), + Tag("сексуально возбужденная", "horny"), + Tag("спортивная форма", "sports_uniform"), + Tag("спящие", "sleeping"), + Tag("страпон", "strapon"), + Tag("Суккуб", "succubus"), + Tag("темнокожие", "dark_skin"), + Tag("толстушки", "fatties"), + Tag("трап", "trap"), + Tag("униформа", "uniform"), + Tag("ушастые", "eared"), + Tag("фантазии", "dreams"), + Tag("фемдом", "femdom"), + Tag("фестиваль", "festival"), + Tag("фетиш", "fetish"), + Tag("фистинг", "fisting"), + Tag("фурри", "furry"), + Tag("футанари имеет парня", "futanari_on_boy"), + Tag("футджаб", "footfuck"), + Tag("цельный купальник", "full_swimsuit"), + Tag("цундэрэ", "tsundere"), + Tag("чулки", "hose"), + Tag("шалава", "slut"), + Tag("шантаж", "blackmail"), + Tag("эксгибиционизм", "exhibitionism"), + Tag("эльфы", "elves"), + Tag("яндере", "yandere"), + ) + + private val tagsName = getTagsList().map { + it.name + }.toTypedArray() + + 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://z.allhen.online" + } +} diff --git a/multisrc/overrides/grouple/default/AndroidManifest.xml b/multisrc/overrides/grouple/default/AndroidManifest.xml new file mode 100644 index 000000000..294993e55 --- /dev/null +++ b/multisrc/overrides/grouple/default/AndroidManifest.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + diff --git a/multisrc/overrides/grouple/mintmanga/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/grouple/mintmanga/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..cbc0d3927 Binary files /dev/null and b/multisrc/overrides/grouple/mintmanga/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/grouple/mintmanga/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/grouple/mintmanga/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..b7a7d167e Binary files /dev/null and b/multisrc/overrides/grouple/mintmanga/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/grouple/mintmanga/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/grouple/mintmanga/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..cdc090f10 Binary files /dev/null and b/multisrc/overrides/grouple/mintmanga/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/grouple/mintmanga/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/grouple/mintmanga/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..626bfc7d1 Binary files /dev/null and b/multisrc/overrides/grouple/mintmanga/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/grouple/mintmanga/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/grouple/mintmanga/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..56bc00e18 Binary files /dev/null and b/multisrc/overrides/grouple/mintmanga/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/grouple/mintmanga/src/MintManga.kt b/multisrc/overrides/grouple/mintmanga/src/MintManga.kt new file mode 100644 index 000000000..8765232ff --- /dev/null +++ b/multisrc/overrides/grouple/mintmanga/src/MintManga.kt @@ -0,0 +1,201 @@ +package eu.kanade.tachiyomi.extension.ru.mintmanga + +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 MintManga : GroupLe("MintManga", "https://mintmanga.com", "ru") { + + override val id: Long = 6 + + 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 -> + when (filter) { + is GenreList -> filter.state.forEach { genre -> + if (genre.state != Filter.TriState.STATE_IGNORE) { + url.addQueryParameter(genre.id, arrayOf("=", "=in", "=ex")[genre.state]) + } + } + is Category -> filter.state.forEach { category -> + if (category.state != Filter.TriState.STATE_IGNORE) { + url.addQueryParameter(category.id, arrayOf("=", "=in", "=ex")[category.state]) + } + } + is AgeList -> filter.state.forEach { age -> + if (age.state != Filter.TriState.STATE_IGNORE) { + url.addQueryParameter(age.id, arrayOf("=", "=in", "=ex")[age.state]) + } + } + is More -> filter.state.forEach { more -> + if (more.state != Filter.TriState.STATE_IGNORE) { + url.addQueryParameter(more.id, arrayOf("=", "=in", "=ex")[more.state]) + } + } + is FilList -> filter.state.forEach { fils -> + if (fils.state != Filter.TriState.STATE_IGNORE) { + url.addQueryParameter(fils.id, arrayOf("=", "=in", "=ex")[fils.state]) + } + } + is OrderBy -> { + if (url.toString().contains("&") && filter.state < 6) { + url.addQueryParameter("sortType", arrayOf("RATING", "POPULARITY", "YEAR", "NAME", "DATE_CREATE", "DATE_UPDATE")[filter.state]) + } else { + val ord = arrayOf("rate", "popularity", "year", "name", "created", "updated", "votes")[filter.state] + val ordUrl = "$baseUrl/list?sortType=$ord&offset=${70 * (page - 1)}".toHttpUrlOrNull()!!.newBuilder() + return GET(ordUrl.toString(), headers) + } + } + else -> {} + } + } + return if (url.toString().contains("&")) { + GET(url.toString().replace("=%3D", "="), headers) + } else { + popularMangaRequest(page) + } + } + + private class OrderBy : Filter.Select( + "Сортировка", + arrayOf("По популярности", "Популярно сейчас", "По году", "По имени", "Новинки", "По дате обновления", "По рейтингу"), + ) + + private class Genre(name: String, val id: String) : Filter.TriState(name) + + private class GenreList(genres: List) : Filter.Group("Жанры", genres) + private class Category(categories: List) : Filter.Group("Категории", categories) + private class AgeList(ages: List) : Filter.Group("Возрастная рекомендация", ages) + private class More(moren: List) : Filter.Group("Прочее", moren) + private class FilList(fils: List) : Filter.Group("Фильтры", fils) + + override fun getFilterList() = FilterList( + OrderBy(), + Category(getCategoryList()), + GenreList(getGenreList()), + AgeList(getAgeList()), + More(getMore()), + FilList(getFilList()), + ) + private fun getFilList() = listOf( + Genre("Высокий рейтинг", "s_high_rate"), + Genre("Сингл", "s_single"), + Genre("Для взрослых", "s_mature"), + Genre("Завершенная", "s_completed"), + Genre("Переведено", "s_translated"), + Genre("Заброшен перевод", "s_abandoned_popular"), + Genre("Длинная", "s_many_chapters"), + Genre("Ожидает загрузки", "s_wait_upload"), + Genre("Белые жанры", "s_not_pessimized"), + ) + private fun getMore() = listOf( + Genre("Анонс", "el_6641"), + Genre("В цвете", "el_4614"), + Genre("Веб", "el_1355"), + Genre("Выпуск приостановлен", "el_5232"), + Genre("Не Яой", "el_1874"), + Genre("Сборник", "el_1348"), + ) + + private fun getAgeList() = listOf( + Genre("R(16+)", "el_3968"), + Genre("NC-17(18+)", "el_3969"), + Genre("R18+(18+)", "el_3990"), + ) + + private fun getCategoryList() = listOf( + Genre("OEL-манга", "el_6637"), + Genre("Додзинси", "el_1332"), + Genre("Арт", "el_2220"), + Genre("Ёнкома", "el_2741"), + Genre("Комикс", "el_1903"), + Genre("Манга", "el_6421"), + Genre("Манхва", "el_1873"), + Genre("Маньхуа", "el_1875"), + Genre("Ранобэ", "el_5688"), + ) + + private fun getGenreList() = listOf( + Genre("боевик", "el_1346"), + Genre("боевые искусства", "el_1334"), + Genre("гарем", "el_1333"), + Genre("гендерная интрига", "el_1347"), + Genre("героическое фэнтези", "el_1337"), + Genre("детектив", "el_1343"), + Genre("дзёсэй", "el_1349"), + Genre("драма", "el_1310"), + Genre("игра", "el_5229"), + Genre("исэкай", "el_6420"), + Genre("история", "el_1311"), + Genre("киберпанк", "el_1351"), + Genre("комедия", "el_1328"), + Genre("меха", "el_1318"), + Genre("научная фантастика", "el_1325"), + Genre("омегаверс", "el_5676"), + Genre("повседневность", "el_1327"), + Genre("постапокалиптика", "el_1342"), + Genre("приключения", "el_1322"), + Genre("психология", "el_1335"), + Genre("романтика", "el_1313"), + Genre("самурайский боевик", "el_1316"), + Genre("сверхъестественное", "el_1350"), + Genre("сёдзё", "el_1314"), + Genre("сёдзё-ай", "el_1320"), + Genre("сёнэн", "el_1326"), + Genre("сёнэн-ай", "el_1330"), + Genre("спорт", "el_1321"), + Genre("сэйнэн", "el_1329"), + Genre("сянься", "el_6631"), + Genre("трагедия", "el_1344"), + Genre("триллер", "el_1341"), + Genre("ужасы", "el_1317"), + Genre("уся", "el_6632"), + Genre("фэнтези", "el_1323"), + Genre("школа", "el_1319"), + Genre("эротика", "el_1340"), + Genre("этти", "el_1354"), + 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/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/grouple/readmanga/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..3a287acfc Binary files /dev/null and b/multisrc/overrides/grouple/readmanga/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/grouple/readmanga/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/grouple/readmanga/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..8ebcb6940 Binary files /dev/null and b/multisrc/overrides/grouple/readmanga/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/grouple/readmanga/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/grouple/readmanga/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..51af633ab Binary files /dev/null and b/multisrc/overrides/grouple/readmanga/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/grouple/readmanga/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/grouple/readmanga/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..37d39ba2e Binary files /dev/null and b/multisrc/overrides/grouple/readmanga/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/grouple/readmanga/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/grouple/readmanga/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..88764f0bb Binary files /dev/null and b/multisrc/overrides/grouple/readmanga/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/grouple/readmanga/src/ReadManga.kt b/multisrc/overrides/grouple/readmanga/src/ReadManga.kt new file mode 100644 index 000000000..0375fb858 --- /dev/null +++ b/multisrc/overrides/grouple/readmanga/src/ReadManga.kt @@ -0,0 +1,197 @@ +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 -> + when (filter) { + is GenreList -> filter.state.forEach { genre -> + if (genre.state != Filter.TriState.STATE_IGNORE) { + url.addQueryParameter(genre.id, arrayOf("=", "=in", "=ex")[genre.state]) + } + } + is Category -> filter.state.forEach { category -> + if (category.state != Filter.TriState.STATE_IGNORE) { + url.addQueryParameter(category.id, arrayOf("=", "=in", "=ex")[category.state]) + } + } + is AgeList -> filter.state.forEach { age -> + if (age.state != Filter.TriState.STATE_IGNORE) { + url.addQueryParameter(age.id, arrayOf("=", "=in", "=ex")[age.state]) + } + } + is More -> filter.state.forEach { more -> + if (more.state != Filter.TriState.STATE_IGNORE) { + url.addQueryParameter(more.id, arrayOf("=", "=in", "=ex")[more.state]) + } + } + is FilList -> filter.state.forEach { fils -> + if (fils.state != Filter.TriState.STATE_IGNORE) { + url.addQueryParameter(fils.id, arrayOf("=", "=in", "=ex")[fils.state]) + } + } + is OrderBy -> { + if (url.toString().contains("&") && filter.state < 6) { + url.addQueryParameter("sortType", arrayOf("RATING", "POPULARITY", "YEAR", "NAME", "DATE_CREATE", "DATE_UPDATE")[filter.state]) + } else { + val ord = arrayOf("rate", "popularity", "year", "name", "created", "updated", "votes")[filter.state] + val ordUrl = "$baseUrl/list?sortType=$ord&offset=${70 * (page - 1)}".toHttpUrlOrNull()!!.newBuilder() + return GET(ordUrl.toString(), headers) + } + } + else -> {} + } + } + return if (url.toString().contains("&")) { + GET(url.toString().replace("=%3D", "="), headers) + } else { + popularMangaRequest(page) + } + } + + private class OrderBy : Filter.Select( + "Сортировка", + arrayOf("По популярности", "Популярно сейчас", "По году", "По имени", "Новинки", "По дате обновления", "По рейтингу"), + ) + + private class Genre(name: String, val id: String) : Filter.TriState(name) + + private class GenreList(genres: List) : Filter.Group("Жанры", genres) + private class Category(categories: List) : Filter.Group("Категории", categories) + private class AgeList(ages: List) : Filter.Group("Возрастная рекомендация", ages) + private class More(moren: List) : Filter.Group("Прочее", moren) + private class FilList(fils: List) : Filter.Group("Фильтры", fils) + + override fun getFilterList() = FilterList( + OrderBy(), + Category(getCategoryList()), + GenreList(getGenreList()), + AgeList(getAgeList()), + More(getMore()), + FilList(getFilList()), + ) + + private fun getFilList() = listOf( + Genre("Высокий рейтинг", "s_high_rate"), + Genre("Сингл", "s_single"), + Genre("Для взрослых", "s_mature"), + Genre("Завершенная", "s_completed"), + Genre("Переведено", "s_translated"), + Genre("Заброшен перевод", "s_abandoned_popular"), + Genre("Длинная", "s_many_chapters"), + Genre("Ожидает загрузки", "s_wait_upload"), + Genre("Продается", "s_sale"), + Genre("Белые жанры", "s_not_pessimized"), + ) + private fun getMore() = listOf( + Genre("Анонс", "el_9578"), + Genre("В цвете", "el_7290"), + Genre("Веб", "el_2160"), + Genre("Сборник", "el_2157"), + ) + + private fun getAgeList() = listOf( + Genre("G(0+)", "el_6180"), + Genre("PG-13(12+)", "el_6181"), + Genre("PG(16+)", "el_6179"), + ) + + private fun getCategoryList() = listOf( + Genre("OEL-манга", "el_9577"), + Genre("Додзинси", "el_2141"), + Genre("Арт", "el_5685"), + Genre("Ёнкома", "el_2161"), + Genre("Комикс", "el_3515"), + Genre("Манга", "el_9451"), + Genre("Манхва", "el_3001"), + Genre("Маньхуа", "el_3002"), + ) + + private fun getGenreList() = listOf( + Genre("боевик", "el_2155"), + Genre("боевые искусства", "el_2143"), + Genre("гарем", "el_2142"), + Genre("гендерная интрига", "el_2156"), + Genre("героическое фэнтези", "el_2146"), + Genre("детектив", "el_2152"), + Genre("дзёсэй", "el_2158"), + Genre("драма", "el_2118"), + Genre("игра", "el_2154"), + Genre("исэкай", "el_9450"), + Genre("история", "el_2119"), + Genre("киберпанк", "el_8032"), + Genre("кодомо", "el_2137"), + Genre("комедия", "el_2136"), + Genre("махо-сёдзё", "el_2147"), + Genre("меха", "el_2126"), + Genre("научная фантастика", "el_2133"), + Genre("повседневность", "el_2135"), + Genre("постапокалиптика", "el_2151"), + Genre("приключения", "el_2130"), + Genre("психология", "el_2144"), + Genre("романтика", "el_2121"), + Genre("самурайский боевик", "el_2124"), + Genre("сверхъестественное", "el_2159"), + Genre("сёдзё", "el_2122"), + Genre("сёдзё-ай", "el_2128"), + Genre("сёнэн", "el_2134"), + Genre("сёнэн-ай", "el_2139"), + Genre("спорт", "el_2129"), + Genre("сэйнэн", "el_2138"), + Genre("сянься", "el_9561"), + Genre("трагедия", "el_2153"), + Genre("триллер", "el_2150"), + Genre("ужасы", "el_2125"), + Genre("уся", "el_9560"), + Genre("фэнтези", "el_2131"), + 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/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/grouple/rumix/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..26dea9c1c Binary files /dev/null and b/multisrc/overrides/grouple/rumix/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/grouple/rumix/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/grouple/rumix/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..1b214efa4 Binary files /dev/null and b/multisrc/overrides/grouple/rumix/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/grouple/rumix/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/grouple/rumix/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..73a45df39 Binary files /dev/null and b/multisrc/overrides/grouple/rumix/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/grouple/rumix/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/grouple/rumix/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..dc8aaaf40 Binary files /dev/null and b/multisrc/overrides/grouple/rumix/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/grouple/rumix/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/grouple/rumix/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..2d263c880 Binary files /dev/null and b/multisrc/overrides/grouple/rumix/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/grouple/rumix/src/RuMIX.kt b/multisrc/overrides/grouple/rumix/src/RuMIX.kt new file mode 100644 index 000000000..6d2efe76d --- /dev/null +++ b/multisrc/overrides/grouple/rumix/src/RuMIX.kt @@ -0,0 +1,81 @@ +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 -> + when (filter) { + is OrderBy -> { + if (url.toString().contains("&") && filter.state < 6) { + url.addQueryParameter("sortType", arrayOf("RATING", "POPULARITY", "YEAR", "NAME", "DATE_CREATE", "DATE_UPDATE")[filter.state]) + } else { + val ord = arrayOf("rate", "popularity", "year", "name", "created", "updated", "votes")[filter.state] + val ordUrl = "$baseUrl/list?sortType=$ord&offset=${70 * (page - 1)}".toHttpUrlOrNull()!!.newBuilder() + return GET(ordUrl.toString(), headers) + } + } + else -> return@forEach + } + } + return if (url.toString().contains("&")) { + GET(url.toString().replace("=%3D", "="), headers) + } else { + popularMangaRequest(page) + } + } + private class OrderBy : Filter.Select( + "Сортировка", + arrayOf("По популярности", "Популярно сейчас", "По году", "По имени", "Новинки", "По дате обновления", "По рейтингу"), + ) + + 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/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/grouple/selfmanga/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..43778af35 Binary files /dev/null and b/multisrc/overrides/grouple/selfmanga/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/grouple/selfmanga/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/grouple/selfmanga/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..7d991c0ad Binary files /dev/null and b/multisrc/overrides/grouple/selfmanga/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/grouple/selfmanga/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/grouple/selfmanga/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..b4ea98529 Binary files /dev/null and b/multisrc/overrides/grouple/selfmanga/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/grouple/selfmanga/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/grouple/selfmanga/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..54fea1b05 Binary files /dev/null and b/multisrc/overrides/grouple/selfmanga/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/grouple/selfmanga/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/grouple/selfmanga/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..a7f0a9e56 Binary files /dev/null and b/multisrc/overrides/grouple/selfmanga/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/grouple/selfmanga/src/SelfManga.kt b/multisrc/overrides/grouple/selfmanga/src/SelfManga.kt new file mode 100644 index 000000000..a370374aa --- /dev/null +++ b/multisrc/overrides/grouple/selfmanga/src/SelfManga.kt @@ -0,0 +1,144 @@ +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 -> + when (filter) { + is GenreList -> filter.state.forEach { genre -> + if (genre.state != Filter.TriState.STATE_IGNORE) { + url.addQueryParameter(genre.id, arrayOf("=", "=in", "=ex")[genre.state]) + } + } + is Category -> filter.state.forEach { category -> + if (category.state != Filter.TriState.STATE_IGNORE) { + url.addQueryParameter(category.id, arrayOf("=", "=in", "=ex")[category.state]) + } + } + is OrderBy -> { + if (url.toString().contains("&") && filter.state < 6) { + url.addQueryParameter("sortType", arrayOf("RATING", "POPULARITY", "YEAR", "NAME", "DATE_CREATE", "DATE_UPDATE")[filter.state]) + } else { + val ord = arrayOf("rate", "popularity", "year", "name", "created", "updated", "votes")[filter.state] + val ordUrl = "$baseUrl/list?sortType=$ord&offset=${70 * (page - 1)}".toHttpUrlOrNull()!!.newBuilder() + return GET(ordUrl.toString(), headers) + } + } + else -> return@forEach + } + } + return if (url.toString().contains("&")) { + GET(url.toString().replace("=%3D", "="), headers) + } else { + popularMangaRequest(page) + } + } + + private class OrderBy : Filter.Select( + "Сортировка", + arrayOf("По популярности", "Популярно сейчас", "По году", "По имени", "Новинки", "По дате обновления", "По рейтингу"), + ) + + private class Genre(name: String, val id: String) : Filter.TriState(name) + private class GenreList(genres: List) : Filter.Group("Жанры", genres) + private class Category(categories: List) : Filter.Group("Категории", categories) + + override fun getFilterList() = FilterList( + OrderBy(), + Category(getCategoryList()), + GenreList(getGenreList()), + ) + + private fun getCategoryList() = listOf( + Genre("Артбук", "el_5894"), + Genre("Веб", "el_2160"), + Genre("Журнал", "el_4983"), + Genre("Ранобэ", "el_5215"), + Genre("Сборник", "el_2157"), + ) + + private fun getGenreList() = listOf( + Genre("боевик", "el_2155"), + Genre("боевые искусства", "el_2143"), + Genre("гарем", "el_2142"), + Genre("гендерная интрига", "el_2156"), + Genre("героическое фэнтези", "el_2146"), + Genre("детектив", "el_2152"), + Genre("дзёсэй", "el_2158"), + Genre("додзинси", "el_2141"), + Genre("драма", "el_2118"), + Genre("ёнкома", "el_2161"), + Genre("история", "el_2119"), + Genre("комедия", "el_2136"), + Genre("махо-сёдзё", "el_2147"), + Genre("мистика", "el_2132"), + Genre("научная фантастика", "el_2133"), + Genre("повседневность", "el_2135"), + Genre("постапокалиптика", "el_2151"), + Genre("приключения", "el_2130"), + Genre("психология", "el_2144"), + Genre("романтика", "el_2121"), + Genre("сверхъестественное", "el_2159"), + Genre("сёдзё", "el_2122"), + Genre("сёдзё-ай", "el_2128"), + Genre("сёнэн", "el_2134"), + Genre("сёнэн-ай", "el_2139"), + Genre("спорт", "el_2129"), + Genre("сэйнэн", "el_5838"), + Genre("трагедия", "el_2153"), + Genre("триллер", "el_2150"), + Genre("ужасы", "el_2125"), + Genre("фантастика", "el_2140"), + Genre("фэнтези", "el_2131"), + 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/dankefurslesen/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/guya/dankefurslesen/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..a64fb0ff7 Binary files /dev/null and b/multisrc/overrides/guya/dankefurslesen/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/guya/dankefurslesen/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/guya/dankefurslesen/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..1d17658d5 Binary files /dev/null and b/multisrc/overrides/guya/dankefurslesen/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/guya/dankefurslesen/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/guya/dankefurslesen/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..a2901cf76 Binary files /dev/null and b/multisrc/overrides/guya/dankefurslesen/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/guya/dankefurslesen/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/guya/dankefurslesen/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..97b101dc7 Binary files /dev/null and b/multisrc/overrides/guya/dankefurslesen/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/guya/dankefurslesen/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/guya/dankefurslesen/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..d8235e528 Binary files /dev/null and b/multisrc/overrides/guya/dankefurslesen/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/guya/default/AndroidManifest.xml b/multisrc/overrides/guya/default/AndroidManifest.xml new file mode 100644 index 000000000..5891c5cca --- /dev/null +++ b/multisrc/overrides/guya/default/AndroidManifest.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + diff --git a/multisrc/overrides/guya/default/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/guya/default/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..3fed53ada Binary files /dev/null and b/multisrc/overrides/guya/default/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/guya/default/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/guya/default/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..b31500c56 Binary files /dev/null and b/multisrc/overrides/guya/default/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/guya/default/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/guya/default/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..325b12a21 Binary files /dev/null and b/multisrc/overrides/guya/default/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/guya/default/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/guya/default/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..06c421da2 Binary files /dev/null and b/multisrc/overrides/guya/default/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/guya/default/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/guya/default/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..76c5d0784 Binary files /dev/null and b/multisrc/overrides/guya/default/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/guya/guya/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/guya/guya/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..3fed53ada Binary files /dev/null and b/multisrc/overrides/guya/guya/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/guya/guya/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/guya/guya/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..b31500c56 Binary files /dev/null and b/multisrc/overrides/guya/guya/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/guya/guya/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/guya/guya/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..325b12a21 Binary files /dev/null and b/multisrc/overrides/guya/guya/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/guya/guya/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/guya/guya/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..06c421da2 Binary files /dev/null and b/multisrc/overrides/guya/guya/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/guya/guya/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/guya/guya/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..76c5d0784 Binary files /dev/null and b/multisrc/overrides/guya/guya/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/guya/hachirumi/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/guya/hachirumi/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..ca9b7c95e Binary files /dev/null and b/multisrc/overrides/guya/hachirumi/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/guya/hachirumi/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/guya/hachirumi/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..58618343c Binary files /dev/null and b/multisrc/overrides/guya/hachirumi/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/guya/hachirumi/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/guya/hachirumi/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..945c17871 Binary files /dev/null and b/multisrc/overrides/guya/hachirumi/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/guya/hachirumi/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/guya/hachirumi/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..bf2c238a7 Binary files /dev/null and b/multisrc/overrides/guya/hachirumi/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/guya/hachirumi/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/guya/hachirumi/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..2c5d7ec00 Binary files /dev/null and b/multisrc/overrides/guya/hachirumi/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/guya/magicaltranslators/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/guya/magicaltranslators/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..915b10c78 Binary files /dev/null and b/multisrc/overrides/guya/magicaltranslators/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/guya/magicaltranslators/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/guya/magicaltranslators/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..1cd439c14 Binary files /dev/null and b/multisrc/overrides/guya/magicaltranslators/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/guya/magicaltranslators/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/guya/magicaltranslators/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..a2b798398 Binary files /dev/null and b/multisrc/overrides/guya/magicaltranslators/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/guya/magicaltranslators/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/guya/magicaltranslators/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..b13ecf747 Binary files /dev/null and b/multisrc/overrides/guya/magicaltranslators/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/guya/magicaltranslators/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/guya/magicaltranslators/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..170d2ead7 Binary files /dev/null and b/multisrc/overrides/guya/magicaltranslators/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/guya/magicaltranslators/src/MagicalTranslators.kt b/multisrc/overrides/guya/magicaltranslators/src/MagicalTranslators.kt new file mode 100644 index 000000000..326b0cea5 --- /dev/null +++ b/multisrc/overrides/guya/magicaltranslators/src/MagicalTranslators.kt @@ -0,0 +1,50 @@ +package eu.kanade.tachiyomi.extension.all.magicaltranslators + +import eu.kanade.tachiyomi.multisrc.guya.Guya +import eu.kanade.tachiyomi.source.SourceFactory +import eu.kanade.tachiyomi.source.model.MangasPage +import okhttp3.Response + +class MagicalTranslatorsFactory : SourceFactory { + override fun createSources() = listOf( + MagicalTranslatorsEN(), + MagicalTranslatorsES(), + MagicalTranslatorsPL(), + ) +} + +abstract class MagicalTranslatorsCommon(lang: String) : + Guya("Magical Translators", "https://mahoushoujobu.com", lang) { + + protected abstract fun filterMangasPage(mangasPage: MangasPage): MangasPage + + override fun popularMangaParse(response: Response): MangasPage = + filterMangasPage(super.popularMangaParse(response)) + + override fun latestUpdatesParse(response: Response): MangasPage = + filterMangasPage(super.latestUpdatesParse(response)) + + override fun searchMangaParseWithSlug(response: Response, slug: String): MangasPage = + filterMangasPage(super.searchMangaParseWithSlug(response, slug)) + + override fun searchMangaParse(response: Response, query: String): MangasPage = + filterMangasPage(super.searchMangaParse(response, query)) +} + +class MagicalTranslatorsEN : MagicalTranslatorsCommon("en") { + override fun filterMangasPage(mangasPage: MangasPage): MangasPage = mangasPage.copy( + mangas = mangasPage.mangas.filterNot { it.url.endsWith("-ES") || it.url.endsWith("-PL") }, + ) +} + +class MagicalTranslatorsES : MagicalTranslatorsCommon("es") { + override fun filterMangasPage(mangasPage: MangasPage): MangasPage = mangasPage.copy( + mangas = mangasPage.mangas.filter { it.url.endsWith("-ES") }, + ) +} + +class MagicalTranslatorsPL : MagicalTranslatorsCommon("pl") { + override fun filterMangasPage(mangasPage: MangasPage): MangasPage = mangasPage.copy( + mangas = mangasPage.mangas.filter { it.url.endsWith("-PL") }, + ) +} diff --git a/multisrc/overrides/heancms/default/AndroidManifest.xml b/multisrc/overrides/heancms/default/AndroidManifest.xml new file mode 100644 index 000000000..aa0a463e1 --- /dev/null +++ b/multisrc/overrides/heancms/default/AndroidManifest.xml @@ -0,0 +1,22 @@ + + + + + + + + + + + + + + + diff --git a/multisrc/overrides/heancms/default/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/heancms/default/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..906d6af2b Binary files /dev/null and b/multisrc/overrides/heancms/default/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/heancms/default/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/heancms/default/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..702ad7b64 Binary files /dev/null and b/multisrc/overrides/heancms/default/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/heancms/default/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/heancms/default/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..7c8f5d756 Binary files /dev/null and b/multisrc/overrides/heancms/default/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/heancms/default/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/heancms/default/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..cc83692bb Binary files /dev/null and b/multisrc/overrides/heancms/default/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/heancms/default/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/heancms/default/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..57c4616cc Binary files /dev/null and b/multisrc/overrides/heancms/default/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/heancms/omegascans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/heancms/omegascans/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..cb37e8e28 Binary files /dev/null and b/multisrc/overrides/heancms/omegascans/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/heancms/omegascans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/heancms/omegascans/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..9b7ca6c59 Binary files /dev/null and b/multisrc/overrides/heancms/omegascans/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/heancms/omegascans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/heancms/omegascans/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..6d3e8517e Binary files /dev/null and b/multisrc/overrides/heancms/omegascans/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/heancms/omegascans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/heancms/omegascans/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..2967a8309 Binary files /dev/null and b/multisrc/overrides/heancms/omegascans/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/heancms/omegascans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/heancms/omegascans/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..5f1d4161d Binary files /dev/null and b/multisrc/overrides/heancms/omegascans/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/heancms/omegascans/src/OmegaScans.kt b/multisrc/overrides/heancms/omegascans/src/OmegaScans.kt new file mode 100644 index 000000000..6daaec326 --- /dev/null +++ b/multisrc/overrides/heancms/omegascans/src/OmegaScans.kt @@ -0,0 +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 + +class OmegaScans : HeanCms("Omega Scans", "https://omegascans.org", "en") { + + 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 000000000..acb868c34 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 000000000..164f6611a 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 000000000..4cf6669f3 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 000000000..74c2a6dc5 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 000000000..fee551171 Binary files /dev/null and b/multisrc/overrides/heancms/perfscan/res/mipmap-xxxhdpi/ic_launcher.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 000000000..00e8b879a --- /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/templescan/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/heancms/templescan/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..0e3fb7a52 Binary files /dev/null and b/multisrc/overrides/heancms/templescan/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/heancms/templescan/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/heancms/templescan/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..282c12a4d Binary files /dev/null and b/multisrc/overrides/heancms/templescan/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/heancms/templescan/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/heancms/templescan/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..50ea886d7 Binary files /dev/null and b/multisrc/overrides/heancms/templescan/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/heancms/templescan/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/heancms/templescan/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..6cd4a9e3f Binary files /dev/null and b/multisrc/overrides/heancms/templescan/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/heancms/templescan/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/heancms/templescan/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..3ec4e450e Binary files /dev/null and b/multisrc/overrides/heancms/templescan/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/heancms/templescan/src/TempleScan.kt b/multisrc/overrides/heancms/templescan/src/TempleScan.kt new file mode 100644 index 000000000..1470f122f --- /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 new file mode 100644 index 000000000..ce8e5993f --- /dev/null +++ b/multisrc/overrides/heancms/yugenmangas/src/YugenMangas.kt @@ -0,0 +1,165 @@ +package eu.kanade.tachiyomi.extension.es.yugenmangas + +import android.app.Application +import android.content.SharedPreferences +import eu.kanade.tachiyomi.multisrc.heancms.Genre +import eu.kanade.tachiyomi.multisrc.heancms.HeanCms +import eu.kanade.tachiyomi.network.interceptor.rateLimitHost +import okhttp3.HttpUrl.Companion.toHttpUrl +import okhttp3.Interceptor +import okhttp3.ProtocolException +import okhttp3.Response +import uy.kohesive.injekt.Injekt +import uy.kohesive.injekt.api.get +import java.io.IOException +import java.text.SimpleDateFormat +import java.util.TimeZone +import java.util.concurrent.TimeUnit + +class YugenMangas : + HeanCms( + "YugenMangas", + "https://yugenmangas.net", + "es", + "https://api.yugenmangas.net", + ) { + + // Site changed from Madara to HeanCms. + override val versionId = 2 + + override val baseUrl by lazy { getPrefBaseUrl() } + + private val preferences by lazy { + Injekt.get().getSharedPreferences("source_$id", 0x0000) + } + + private var lastDomain = "" + + private fun domainChangeIntercept(chain: Interceptor.Chain): Response { + val request = chain.request() + + if (!request.url.host.startsWith("yugenmangas")) { + return chain.proceed(request) + } + + if (lastDomain.isNotEmpty()) { + val newUrl = request.url.newBuilder() + .host(preferences.baseUrlHost) + .build() + + return chain.proceed( + request.newBuilder() + .url(newUrl) + .build(), + ) + } + + val response = try { + chain.proceed(request) + } catch (e: ProtocolException) { + if (e.message?.contains("Too many follow-up requests") == true) { + throw IOException("No se pudo obtener la nueva URL del sitio") + } else { + throw e + } + } + + if (request.url.host == response.request.url.host) return response + + response.close() + + preferences.baseUrlHost = response.request.url.host + + lastDomain = request.url.host + + val newUrl = request.url.newBuilder() + .host(response.request.url.host) + .build() + + return chain.proceed( + request.newBuilder() + .url(newUrl) + .build(), + ) + } + + override val slugStrategy = SlugStrategy.ID + override val useNewQueryEndpoint = true + + override val client = super.client.newBuilder() + .connectTimeout(60, TimeUnit.SECONDS) + .readTimeout(90, TimeUnit.SECONDS) + .rateLimitHost(apiUrl.toHttpUrl(), 2, 3) + .addInterceptor(::domainChangeIntercept) + .build() + + override val coverPath: String = "" + + override val dateFormat: SimpleDateFormat = super.dateFormat.apply { + timeZone = TimeZone.getTimeZone("UTC") + } + + override fun getGenreList(): List = listOf( + Genre("+18", 1), + Genre("Acción", 36), + Genre("Adulto", 38), + Genre("Apocalíptico", 3), + Genre("Artes marciales (1)", 16), + Genre("Artes marciales (2)", 37), + Genre("Aventura", 2), + Genre("Boys Love", 4), + Genre("Ciencia ficción", 39), + Genre("Comedia", 5), + Genre("Demonios", 6), + Genre("Deporte", 26), + Genre("Drama", 7), + Genre("Ecchi", 8), + Genre("Familia", 9), + Genre("Fantasía", 10), + Genre("Girls Love", 11), + Genre("Gore", 12), + Genre("Harem", 13), + Genre("Harem inverso", 14), + Genre("Histórico", 48), + Genre("Horror", 41), + Genre("Isekai", 40), + Genre("Josei", 15), + Genre("Maduro", 42), + Genre("Magia", 17), + Genre("MangoScan", 35), + Genre("Mecha", 18), + Genre("Militar", 19), + Genre("Misterio", 20), + Genre("Psicológico", 21), + Genre("Realidad virtual", 46), + Genre("Recuentos de la vida", 25), + Genre("Reencarnación", 22), + Genre("Regresion", 23), + Genre("Romance", 24), + Genre("Seinen", 27), + Genre("Shonen", 28), + Genre("Shoujo", 29), + Genre("Sistema", 45), + Genre("Smut", 30), + Genre("Supernatural", 31), + Genre("Supervivencia", 32), + Genre("Tragedia", 33), + Genre("Transmigración", 34), + Genre("Vida Escolar", 47), + Genre("Yaoi", 43), + Genre("Yuri", 44), + ) + + companion object { + private const val defaultBaseUrlHost = "yugenmangas.net" + private const val BASE_URL_PREF = "prefOverrideBaseUrl" + } + + private var SharedPreferences.baseUrlHost + get() = getString(BASE_URL_PREF, defaultBaseUrlHost) ?: defaultBaseUrlHost + set(newHost) { + edit().putString(BASE_URL_PREF, newHost).commit() + } + + private fun getPrefBaseUrl(): String = preferences.baseUrlHost.let { "https://$it" } +} diff --git a/multisrc/overrides/hentaihand/hentaihand/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/hentaihand/hentaihand/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..336381de2 Binary files /dev/null and b/multisrc/overrides/hentaihand/hentaihand/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/hentaihand/hentaihand/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/hentaihand/hentaihand/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..c90b88eae Binary files /dev/null and b/multisrc/overrides/hentaihand/hentaihand/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/hentaihand/hentaihand/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/hentaihand/hentaihand/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..c8b45fbb8 Binary files /dev/null and b/multisrc/overrides/hentaihand/hentaihand/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/hentaihand/hentaihand/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/hentaihand/hentaihand/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..739c509e2 Binary files /dev/null and b/multisrc/overrides/hentaihand/hentaihand/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/hentaihand/hentaihand/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/hentaihand/hentaihand/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..d01b1eeee Binary files /dev/null and b/multisrc/overrides/hentaihand/hentaihand/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/hentaihand/hentaihand/src/HentaiHandFactory.kt b/multisrc/overrides/hentaihand/hentaihand/src/HentaiHandFactory.kt new file mode 100644 index 000000000..8c86fdfbb --- /dev/null +++ b/multisrc/overrides/hentaihand/hentaihand/src/HentaiHandFactory.kt @@ -0,0 +1,97 @@ +package eu.kanade.tachiyomi.extension.all.hentaihand + +import eu.kanade.tachiyomi.multisrc.hentaihand.HentaiHand +import eu.kanade.tachiyomi.source.Source +import eu.kanade.tachiyomi.source.SourceFactory +import okhttp3.OkHttpClient + +class HentaiHandFactory : SourceFactory { + override fun createSources(): List = listOf( + // https://hentaihand.com/api/languages?per_page=50 + HentaiHandOther(), + HentaiHandEn(), + HentaiHandZh(), + HentaiHandJa(), + HentaiHandNoText(), + HentaiHandEo(), + HentaiHandCeb(), + HentaiHandCs(), + HentaiHandAr(), + HentaiHandSk(), + HentaiHandMn(), + HentaiHandUk(), + HentaiHandLa(), + HentaiHandTl(), + HentaiHandEs(), + HentaiHandIt(), + HentaiHandKo(), + HentaiHandTh(), + HentaiHandPl(), + HentaiHandFr(), + HentaiHandPtBr(), + HentaiHandDe(), + HentaiHandFi(), + HentaiHandRu(), + HentaiHandHu(), + HentaiHandId(), + HentaiHandVi(), + HentaiHandNl(), + HentaiHandHi(), + HentaiHandTr(), + HentaiHandEl(), + HentaiHandSr(), + HentaiHandJv(), + HentaiHandBg(), + ) +} +abstract class HentaiHandCommon( + override val lang: String, + hhLangId: List = emptyList(), + // altLangId: Int? = null +) : HentaiHand("HentaiHand", "https://hentaihand.com", lang, false, hhLangId) { + override val client: OkHttpClient = network.cloudflareClient.newBuilder() + .addInterceptor { authIntercept(it) } + .build() +} + +class HentaiHandOther : HentaiHandCommon("all") { + override val id: Long = 1235047015955289468 +} +class HentaiHandJa : HentaiHandCommon("ja", listOf(1, 29)) +class HentaiHandEn : HentaiHandCommon("en", listOf(2, 27)) +class HentaiHandZh : HentaiHandCommon("zh", listOf(3, 50)) +class HentaiHandBg : HentaiHandCommon("bg", listOf(4)) +class HentaiHandCeb : HentaiHandCommon("ceb", listOf(5, 44)) +class HentaiHandNoText : HentaiHandCommon("other", listOf(6)) { + override val id: Long = 7302549142935671434 +} +class HentaiHandTl : HentaiHandCommon("tl", listOf(7, 55)) +class HentaiHandAr : HentaiHandCommon("ar", listOf(8, 49)) +class HentaiHandEl : HentaiHandCommon("el", listOf(9)) +class HentaiHandSr : HentaiHandCommon("sr", listOf(10)) +class HentaiHandJv : HentaiHandCommon("jv", listOf(11, 51)) +class HentaiHandUk : HentaiHandCommon("uk", listOf(12, 46)) +class HentaiHandTr : HentaiHandCommon("tr", listOf(13, 41)) +class HentaiHandFi : HentaiHandCommon("fi", listOf(14, 54)) +class HentaiHandLa : HentaiHandCommon("la", listOf(15)) +class HentaiHandMn : HentaiHandCommon("mn", listOf(16)) +class HentaiHandEo : HentaiHandCommon("eo", listOf(17, 47)) +class HentaiHandSk : HentaiHandCommon("sk", listOf(18)) +class HentaiHandCs : HentaiHandCommon("cs", listOf(19, 52)) +class HentaiHandKo : HentaiHandCommon("ko", listOf(30, 39)) +class HentaiHandRu : HentaiHandCommon("ru", listOf(31)) +class HentaiHandIt : HentaiHandCommon("it", listOf(32)) +class HentaiHandEs : HentaiHandCommon("es", listOf(33, 37)) +class HentaiHandPtBr : HentaiHandCommon("pt-BR", listOf(34)) { + // Hardcode the id because the language wasn't specific. + override val id: Long = 2516244587139644000 +} +class HentaiHandTh : HentaiHandCommon("th", listOf(35, 40)) +class HentaiHandFr : HentaiHandCommon("fr", listOf(36)) +class HentaiHandId : HentaiHandCommon("id", listOf(38)) +class HentaiHandVi : HentaiHandCommon("vi", listOf(42)) +class HentaiHandDe : HentaiHandCommon("de", listOf(43)) +class HentaiHandPl : HentaiHandCommon("pl", listOf(45)) +class HentaiHandHu : HentaiHandCommon("hu", listOf(48)) +class HentaiHandNl : HentaiHandCommon("nl", listOf(53)) +class HentaiHandHi : HentaiHandCommon("hi", listOf(56)) diff --git a/multisrc/overrides/hentaihand/hentaisphere/src/HentaiSphere.kt b/multisrc/overrides/hentaihand/hentaisphere/src/HentaiSphere.kt new file mode 100644 index 000000000..4a9a7109d --- /dev/null +++ b/multisrc/overrides/hentaihand/hentaisphere/src/HentaiSphere.kt @@ -0,0 +1,10 @@ +package eu.kanade.tachiyomi.extension.en.hentaisphere + +import eu.kanade.tachiyomi.multisrc.hentaihand.HentaiHand +import okhttp3.OkHttpClient + +class HentaiSphere : HentaiHand("HentaiSphere", "https://hentaisphere.com", "en", false) { + override val client: OkHttpClient = network.cloudflareClient.newBuilder() + .addInterceptor { authIntercept(it) } + .build() +} diff --git a/multisrc/overrides/hentaihand/manhwaclub/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/hentaihand/manhwaclub/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..3a58383ce Binary files /dev/null and b/multisrc/overrides/hentaihand/manhwaclub/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/hentaihand/manhwaclub/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/hentaihand/manhwaclub/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..1aa197386 Binary files /dev/null and b/multisrc/overrides/hentaihand/manhwaclub/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/hentaihand/manhwaclub/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/hentaihand/manhwaclub/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..3eb9873ec Binary files /dev/null and b/multisrc/overrides/hentaihand/manhwaclub/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/hentaihand/manhwaclub/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/hentaihand/manhwaclub/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..09f5fe5fb Binary files /dev/null and b/multisrc/overrides/hentaihand/manhwaclub/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/hentaihand/manhwaclub/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/hentaihand/manhwaclub/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..319382902 Binary files /dev/null and b/multisrc/overrides/hentaihand/manhwaclub/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/hentaihand/manhwaclub/src/ManhwaClub.kt b/multisrc/overrides/hentaihand/manhwaclub/src/ManhwaClub.kt new file mode 100644 index 000000000..d85893455 --- /dev/null +++ b/multisrc/overrides/hentaihand/manhwaclub/src/ManhwaClub.kt @@ -0,0 +1,10 @@ +package eu.kanade.tachiyomi.extension.en.manhwaclub + +import eu.kanade.tachiyomi.multisrc.hentaihand.HentaiHand +import okhttp3.OkHttpClient + +class ManhwaClub : HentaiHand("ManhwaClub", "https://manhwa.club", "en", true) { + override val client: OkHttpClient = network.cloudflareClient.newBuilder() + .addInterceptor { authIntercept(it) } + .build() +} diff --git a/multisrc/overrides/hentaihand/nhentaicom/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/hentaihand/nhentaicom/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..72dc38e95 Binary files /dev/null and b/multisrc/overrides/hentaihand/nhentaicom/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/hentaihand/nhentaicom/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/hentaihand/nhentaicom/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..dce2ccade Binary files /dev/null and b/multisrc/overrides/hentaihand/nhentaicom/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/hentaihand/nhentaicom/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/hentaihand/nhentaicom/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..52022db8e Binary files /dev/null and b/multisrc/overrides/hentaihand/nhentaicom/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/hentaihand/nhentaicom/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/hentaihand/nhentaicom/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..10f15cc83 Binary files /dev/null and b/multisrc/overrides/hentaihand/nhentaicom/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/hentaihand/nhentaicom/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/hentaihand/nhentaicom/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..490949e05 Binary files /dev/null and b/multisrc/overrides/hentaihand/nhentaicom/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/hentaihand/nhentaicom/src/NHentaiComFactory.kt b/multisrc/overrides/hentaihand/nhentaicom/src/NHentaiComFactory.kt new file mode 100644 index 000000000..0bc0f4976 --- /dev/null +++ b/multisrc/overrides/hentaihand/nhentaicom/src/NHentaiComFactory.kt @@ -0,0 +1,99 @@ +package eu.kanade.tachiyomi.extension.all.nhentaicom + +import eu.kanade.tachiyomi.multisrc.hentaihand.HentaiHand +import eu.kanade.tachiyomi.source.Source +import eu.kanade.tachiyomi.source.SourceFactory +import okhttp3.OkHttpClient + +class NHentaiComFactory : SourceFactory { + override fun createSources(): List = listOf( + // https://nhentai.com/api/languages?per_page=50 + NHentaiComAll(), + NHentaiComEn(), + NHentaiComZh(), + NHentaiComJa(), + NHentaiComNoText(), + NHentaiComEo(), + NHentaiComCeb(), + NHentaiComCs(), + NHentaiComAr(), + NHentaiComSk(), + NHentaiComMn(), + NHentaiComUk(), + NHentaiComLa(), + NHentaiComTl(), + NHentaiComEs(), + NHentaiComIt(), + NHentaiComKo(), + NHentaiComTh(), + NHentaiComPl(), + NHentaiComFr(), + NHentaiComPtBr(), + NHentaiComDe(), + NHentaiComFi(), + NHentaiComRu(), + NHentaiComHu(), + NHentaiComId(), + NHentaiComVi(), + NHentaiComNl(), + NHentaiComTr(), + NHentaiComEl(), + NHentaiComBg(), + NHentaiComSr(), + NHentaiComJv(), + NHentaiComHi(), + ) +} +abstract class NHentaiComCommon( + override val lang: String, + hhLangId: List = emptyList(), + // altLangId: Int? = null +) : HentaiHand("nHentai.com (unoriginal)", "https://nhentai.com", lang, false, hhLangId) { + override val client: OkHttpClient = network.cloudflareClient.newBuilder() + .addInterceptor { authIntercept(it) } + .build() +} + +class NHentaiComAll : NHentaiComCommon("all") { + override val id: Long = 9165839893600661480 +} + +class NHentaiComJa : NHentaiComCommon("ja", listOf(1, 29)) +class NHentaiComEn : NHentaiComCommon("en", listOf(2, 27)) { + override val id: Long = 5591830863732393712 +} +class NHentaiComZh : NHentaiComCommon("zh", listOf(3, 50)) +class NHentaiComBg : NHentaiComCommon("bg", listOf(4)) +class NHentaiComCeb : NHentaiComCommon("ceb", listOf(5, 44)) +class NHentaiComNoText : NHentaiComCommon("other", listOf(6)) { + override val id: Long = 5817327335315373850 +} +class NHentaiComTl : NHentaiComCommon("tl", listOf(7, 55)) +class NHentaiComAr : NHentaiComCommon("ar", listOf(8, 49)) +class NHentaiComEl : NHentaiComCommon("el", listOf(9)) +class NHentaiComSr : NHentaiComCommon("sr", listOf(10)) +class NHentaiComJv : NHentaiComCommon("jv", listOf(11, 51)) +class NHentaiComUk : NHentaiComCommon("uk", listOf(12, 46)) +class NHentaiComTr : NHentaiComCommon("tr", listOf(13, 41)) +class NHentaiComFi : NHentaiComCommon("fi", listOf(14, 54)) +class NHentaiComLa : NHentaiComCommon("la", listOf(15)) +class NHentaiComMn : NHentaiComCommon("mn", listOf(16)) +class NHentaiComEo : NHentaiComCommon("eo", listOf(17, 47)) +class NHentaiComSk : NHentaiComCommon("sk", listOf(18)) +class NHentaiComCs : NHentaiComCommon("cs", listOf(19, 52)) { + override val id: Long = 1144495813995437124 +} +class NHentaiComKo : NHentaiComCommon("ko", listOf(30, 39)) +class NHentaiComRu : NHentaiComCommon("ru", listOf(31)) +class NHentaiComIt : NHentaiComCommon("it", listOf(32)) +class NHentaiComEs : NHentaiComCommon("es", listOf(33, 37)) +class NHentaiComPtBr : NHentaiComCommon("pt-BR", listOf(34)) +class NHentaiComTh : NHentaiComCommon("th", listOf(35, 40)) +class NHentaiComFr : NHentaiComCommon("fr", listOf(36)) +class NHentaiComId : NHentaiComCommon("id", listOf(38)) +class NHentaiComVi : NHentaiComCommon("vi", listOf(42)) +class NHentaiComDe : NHentaiComCommon("de", listOf(43)) +class NHentaiComPl : NHentaiComCommon("pl", listOf(45)) +class NHentaiComHu : NHentaiComCommon("hu", listOf(48)) +class NHentaiComNl : NHentaiComCommon("nl", listOf(53)) +class NHentaiComHi : NHentaiComCommon("hi", listOf(56)) diff --git a/multisrc/overrides/hentaihand/readmanhwa/src/ReadManhwa.kt b/multisrc/overrides/hentaihand/readmanhwa/src/ReadManhwa.kt new file mode 100644 index 000000000..031172fd8 --- /dev/null +++ b/multisrc/overrides/hentaihand/readmanhwa/src/ReadManhwa.kt @@ -0,0 +1,10 @@ +package eu.kanade.tachiyomi.extension.en.readmanhwa + +import eu.kanade.tachiyomi.multisrc.hentaihand.HentaiHand +import okhttp3.OkHttpClient + +class ReadManhwa : HentaiHand("ReadManhwa", "https://readmanhwa.com", "en", true) { + override val client: OkHttpClient = network.cloudflareClient.newBuilder() + .addInterceptor { authIntercept(it) } + .build() +} diff --git a/multisrc/overrides/kemono/coomer/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/kemono/coomer/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..fdf273a9b Binary files /dev/null and b/multisrc/overrides/kemono/coomer/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/kemono/coomer/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/kemono/coomer/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..bf37a1b7a Binary files /dev/null and b/multisrc/overrides/kemono/coomer/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/kemono/coomer/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/kemono/coomer/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..f9b11f5f0 Binary files /dev/null and b/multisrc/overrides/kemono/coomer/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/kemono/coomer/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/kemono/coomer/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..04edc56b2 Binary files /dev/null and b/multisrc/overrides/kemono/coomer/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/kemono/coomer/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/kemono/coomer/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..61b49c814 Binary files /dev/null and b/multisrc/overrides/kemono/coomer/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/kemono/default/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/kemono/default/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..404a9888f Binary files /dev/null and b/multisrc/overrides/kemono/default/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/kemono/default/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/kemono/default/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..b7e10b9f9 Binary files /dev/null and b/multisrc/overrides/kemono/default/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/kemono/default/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/kemono/default/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..fabf9b671 Binary files /dev/null and b/multisrc/overrides/kemono/default/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/kemono/default/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/kemono/default/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..aeff4ae0e Binary files /dev/null and b/multisrc/overrides/kemono/default/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/kemono/default/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/kemono/default/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..1597c0783 Binary files /dev/null and b/multisrc/overrides/kemono/default/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/libgroup/hentailib/AndroidManifest.xml b/multisrc/overrides/libgroup/hentailib/AndroidManifest.xml new file mode 100644 index 000000000..29cb39094 --- /dev/null +++ b/multisrc/overrides/libgroup/hentailib/AndroidManifest.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + diff --git a/multisrc/overrides/libgroup/hentailib/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/libgroup/hentailib/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..41cb9dd7a Binary files /dev/null and b/multisrc/overrides/libgroup/hentailib/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/libgroup/hentailib/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/libgroup/hentailib/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..40d1a9c78 Binary files /dev/null and b/multisrc/overrides/libgroup/hentailib/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/libgroup/hentailib/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/libgroup/hentailib/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..ca16a46fd Binary files /dev/null and b/multisrc/overrides/libgroup/hentailib/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/libgroup/hentailib/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/libgroup/hentailib/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..01ba951d0 Binary files /dev/null and b/multisrc/overrides/libgroup/hentailib/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/libgroup/hentailib/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/libgroup/hentailib/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..8171958cd Binary files /dev/null and b/multisrc/overrides/libgroup/hentailib/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/libgroup/hentailib/src/HentaiLib.kt b/multisrc/overrides/libgroup/hentailib/src/HentaiLib.kt new file mode 100644 index 000000000..aae8a14a0 --- /dev/null +++ b/multisrc/overrides/libgroup/hentailib/src/HentaiLib.kt @@ -0,0 +1,251 @@ +package eu.kanade.tachiyomi.extension.ru.hentailib + +import android.app.Application +import android.content.SharedPreferences +import android.widget.Toast +import androidx.preference.EditTextPreference +import eu.kanade.tachiyomi.multisrc.libgroup.LibGroup +import eu.kanade.tachiyomi.network.POST +import eu.kanade.tachiyomi.source.model.Filter +import eu.kanade.tachiyomi.source.model.FilterList +import okhttp3.Request +import uy.kohesive.injekt.Injekt +import uy.kohesive.injekt.api.get + +class HentaiLib : LibGroup("HentaiLib", "https://hentailib.me", "ru") { + + override val id: Long = 6425650164840473547 + + 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 { + if (csrfToken.isEmpty()) { + val tokenResponse = client.newCall(popularMangaRequest(page)).execute() + val resBody = tokenResponse.body.string() + csrfToken = "_token\" content=\"(.*)\"".toRegex().find(resBody)!!.groups[1]!!.value + } + val url = super.searchMangaRequest(page, query, filters).url.newBuilder() + (if (filters.isEmpty()) getFilterList() else filters).forEach { filter -> + when (filter) { + is TagList -> filter.state.forEach { tag -> + if (tag.state != Filter.TriState.STATE_IGNORE) { + url.addQueryParameter( + if (tag.isIncluded()) "tags[include][]" else "tags[exclude][]", + tag.id, + ) + } + } + else -> {} + } + } + return POST(url.toString(), catalogHeaders()) + } + + // Filters + private class SearchFilter(name: String, val id: String) : Filter.TriState(name) + + private class TagList(tags: List) : Filter.Group("Теги", tags) + + override fun getFilterList(): FilterList { + val filters = super.getFilterList().toMutableList() + filters.add(4, TagList(getTagList())) + return FilterList(filters) + } + + private fun getTagList() = listOf( + SearchFilter("3D", "1"), + SearchFilter("Defloration", "287"), + SearchFilter("FPP(Вид от первого лица)", "289"), + SearchFilter("Footfuck", "5"), + SearchFilter("Handjob", "6"), + SearchFilter("Lactation", "7"), + SearchFilter("Living clothes", "284"), + SearchFilter("Mind break", "9"), + SearchFilter("Scat", "13"), + SearchFilter("Selfcest", "286"), + SearchFilter("Shemale", "220"), + SearchFilter("Tomboy", "14"), + SearchFilter("Unbirth", "283"), + SearchFilter("X-Ray", "15"), + SearchFilter("Алкоголь", "16"), + SearchFilter("Анал", "17"), + SearchFilter("Андроид", "18"), + SearchFilter("Анилингус", "19"), + SearchFilter("Анимация (GIF)", "350"), + SearchFilter("Арт", "20"), + SearchFilter("Ахэгао", "2"), + SearchFilter("БДСМ", "22"), + SearchFilter("Бакуню", "21"), + SearchFilter("Бара", "293"), + SearchFilter("Без проникновения", "336"), + SearchFilter("Без текста", "23"), + SearchFilter("Без трусиков", "24"), + SearchFilter("Без цензуры", "25"), + SearchFilter("Беременность", "26"), + SearchFilter("Бикини", "27"), + SearchFilter("Близнецы", "28"), + SearchFilter("Боди-арт", "29"), + SearchFilter("Больница", "30"), + SearchFilter("Большая грудь", "31"), + SearchFilter("Большая попка", "32"), + SearchFilter("Борьба", "33"), + SearchFilter("Буккакэ", "34"), + SearchFilter("В бассейне", "35"), + SearchFilter("В ванной", "36"), + SearchFilter("В государственном учреждении", "37"), + SearchFilter("В общественном месте", "38"), + SearchFilter("В очках", "8"), + SearchFilter("В первый раз", "39"), + SearchFilter("В транспорте", "40"), + SearchFilter("Вампиры", "41"), + SearchFilter("Вибратор", "42"), + SearchFilter("Втроём", "43"), + SearchFilter("Гипноз", "44"), + SearchFilter("Глубокий минет", "45"), + SearchFilter("Горячий источник", "46"), + SearchFilter("Групповой секс", "47"), + SearchFilter("Гуро", "307"), + SearchFilter("Гяру и Гангуро", "48"), + SearchFilter("Двойное проникновение", "49"), + SearchFilter("Девочки-волшебницы", "50"), + SearchFilter("Девушка-туалет", "51"), + SearchFilter("Демон", "52"), + SearchFilter("Дилдо", "53"), + SearchFilter("Домохозяйка", "54"), + SearchFilter("Дыра в стене", "55"), + SearchFilter("Жестокость", "56"), + SearchFilter("Золотой дождь", "57"), + SearchFilter("Зомби", "58"), + SearchFilter("Зоофилия", "351"), + SearchFilter("Зрелые женщины", "59"), + SearchFilter("Избиение", "223"), + SearchFilter("Измена", "60"), + SearchFilter("Изнасилование", "61"), + SearchFilter("Инопланетяне", "62"), + SearchFilter("Инцест", "63"), + SearchFilter("Исполнение желаний", "64"), + SearchFilter("Историческое", "65"), + SearchFilter("Камера", "66"), + SearchFilter("Кляп", "288"), + SearchFilter("Колготки", "67"), + SearchFilter("Косплей", "68"), + SearchFilter("Кримпай", "3"), + SearchFilter("Куннилингус", "69"), + SearchFilter("Купальники", "70"), + SearchFilter("ЛГБТ", "343"), + SearchFilter("Латекс и кожа", "71"), + SearchFilter("Магия", "72"), + SearchFilter("Маленькая грудь", "73"), + SearchFilter("Мастурбация", "74"), + SearchFilter("Медсестра", "221"), + SearchFilter("Мейдочка", "75"), + SearchFilter("Мерзкий дядька", "76"), + SearchFilter("Милф", "77"), + SearchFilter("Много девушек", "78"), + SearchFilter("Много спермы", "79"), + SearchFilter("Молоко", "80"), + SearchFilter("Монашка", "353"), + SearchFilter("Монстродевушки", "81"), + SearchFilter("Монстры", "82"), + SearchFilter("Мочеиспускание", "83"), + SearchFilter("На природе", "84"), + SearchFilter("Наблюдение", "85"), + SearchFilter("Насекомые", "285"), + SearchFilter("Небритая киска", "86"), + SearchFilter("Небритые подмышки", "87"), + SearchFilter("Нетораре", "88"), + SearchFilter("Нэтори", "11"), + SearchFilter("Обмен телами", "89"), + SearchFilter("Обычный секс", "90"), + SearchFilter("Огромная грудь", "91"), + SearchFilter("Огромный член", "92"), + SearchFilter("Омораси", "93"), + SearchFilter("Оральный секс", "94"), + SearchFilter("Орки", "95"), + SearchFilter("Остановка времени", "296"), + SearchFilter("Пайзури", "96"), + SearchFilter("Парень пассив", "97"), + SearchFilter("Переодевание", "98"), + SearchFilter("Пирсинг", "308"), + SearchFilter("Пляж", "99"), + SearchFilter("Повседневность", "100"), + SearchFilter("Подвязки", "282"), + SearchFilter("Подглядывание", "101"), + SearchFilter("Подчинение", "102"), + SearchFilter("Похищение", "103"), + SearchFilter("Превозмогание", "104"), + SearchFilter("Принуждение", "105"), + SearchFilter("Прозрачная одежда", "106"), + SearchFilter("Проституция", "107"), + SearchFilter("Психические отклонения", "108"), + SearchFilter("Публично", "109"), + SearchFilter("Пытки", "224"), + SearchFilter("Пьяные", "110"), + SearchFilter("Рабы", "356"), + SearchFilter("Рабыни", "111"), + SearchFilter("С Сюжетом", "337"), + SearchFilter("Сuminside", "4"), + SearchFilter("Секс-игрушки", "112"), + SearchFilter("Сексуально возбуждённая", "113"), + SearchFilter("Сибари", "114"), + SearchFilter("Спортивная форма", "117"), + SearchFilter("Спортивное тело", "335"), + SearchFilter("Спящие", "118"), + SearchFilter("Страпон", "119"), + SearchFilter("Суккуб", "120"), + SearchFilter("Темнокожие", "121"), + SearchFilter("Тентакли", "122"), + SearchFilter("Толстушки", "123"), + SearchFilter("Трагедия", "124"), + SearchFilter("Трап", "125"), + SearchFilter("Ужасы", "126"), + SearchFilter("Униформа", "127"), + SearchFilter("Учитель и ученик", "352"), + SearchFilter("Ушастые", "128"), + SearchFilter("Фантазии", "129"), + SearchFilter("Фемдом", "130"), + SearchFilter("Фестиваль", "131"), + SearchFilter("Фетиш", "132"), + SearchFilter("Фистинг", "133"), + SearchFilter("Фурри", "134"), + SearchFilter("Футанари", "136"), + SearchFilter("Футанари имеет парня", "137"), + SearchFilter("Цельный купальник", "138"), + SearchFilter("Цундэрэ", "139"), + SearchFilter("Чикан", "140"), + SearchFilter("Чулки", "141"), + SearchFilter("Шлюха", "142"), + SearchFilter("Эксгибиционизм", "143"), + SearchFilter("Эльф", "144"), + SearchFilter("Юные", "145"), + SearchFilter("Яндэрэ", "146"), + ) + + 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 -> + val warning = "Для смены домена необходимо перезапустить приложение с полной остановкой." + Toast.makeText(screen.context, warning, Toast.LENGTH_LONG).show() + true + } + }.let(screen::addPreference) + } + + companion object { + const val PREFIX_SLUG_SEARCH = "slug:" + + private const val DOMAIN_TITLE = "Домен" + private const val DOMAIN_DEFAULT = "https://hentailib.me" + } +} diff --git a/multisrc/overrides/libgroup/mangalib/AndroidManifest.xml b/multisrc/overrides/libgroup/mangalib/AndroidManifest.xml new file mode 100644 index 000000000..f2f30eed6 --- /dev/null +++ b/multisrc/overrides/libgroup/mangalib/AndroidManifest.xml @@ -0,0 +1,28 @@ + + + + + + + + + + + + + + + + + + diff --git a/multisrc/overrides/libgroup/mangalib/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/libgroup/mangalib/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..4c8909daa Binary files /dev/null and b/multisrc/overrides/libgroup/mangalib/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/libgroup/mangalib/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/libgroup/mangalib/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..5d7bcb424 Binary files /dev/null and b/multisrc/overrides/libgroup/mangalib/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/libgroup/mangalib/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/libgroup/mangalib/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..88c173600 Binary files /dev/null and b/multisrc/overrides/libgroup/mangalib/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/libgroup/mangalib/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/libgroup/mangalib/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..9cd60aef5 Binary files /dev/null and b/multisrc/overrides/libgroup/mangalib/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/libgroup/mangalib/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/libgroup/mangalib/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..fdee8b890 Binary files /dev/null and b/multisrc/overrides/libgroup/mangalib/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/libgroup/mangalib/src/MangaLib.kt b/multisrc/overrides/libgroup/mangalib/src/MangaLib.kt new file mode 100644 index 000000000..6efa9b2ff --- /dev/null +++ b/multisrc/overrides/libgroup/mangalib/src/MangaLib.kt @@ -0,0 +1,208 @@ +package eu.kanade.tachiyomi.extension.ru.mangalib + +import android.app.Application +import android.content.SharedPreferences +import android.widget.Toast +import androidx.preference.ListPreference +import androidx.preference.PreferenceScreen +import eu.kanade.tachiyomi.multisrc.libgroup.LibGroup +import eu.kanade.tachiyomi.network.POST +import eu.kanade.tachiyomi.source.model.Filter +import eu.kanade.tachiyomi.source.model.FilterList +import okhttp3.Request +import uy.kohesive.injekt.Injekt +import uy.kohesive.injekt.api.get + +class MangaLib : LibGroup("MangaLib", "https://mangalib.me", "ru") { + + override val id: Long = 6111047689498497237 + + private val preferences: SharedPreferences by lazy { + Injekt.get().getSharedPreferences("source_${id}_2", 0x0000) + } + + private val baseOrig: String = "https://mangalib.me" + private val baseMirr: String = "https://mangalib.org" + private var domain: String? = preferences.getString(DOMAIN_PREF, baseOrig) + override val baseUrl: String = domain.toString() + + override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { + if (csrfToken.isEmpty()) { + val tokenResponse = client.newCall(popularMangaRequest(page)).execute() + val resBody = tokenResponse.body.string() + csrfToken = "_token\" content=\"(.*)\"".toRegex().find(resBody)!!.groups[1]!!.value + } + val url = super.searchMangaRequest(page, query, filters).url.newBuilder() + (if (filters.isEmpty()) getFilterList() else filters).forEach { filter -> + when (filter) { + is AgeList -> filter.state.forEach { age -> + if (age.state != Filter.TriState.STATE_IGNORE) { + url.addQueryParameter( + if (age.isIncluded()) "caution[include][]" else "caution[exclude][]", + age.id, + ) + } + } + is TagList -> filter.state.forEach { tag -> + if (tag.state != Filter.TriState.STATE_IGNORE) { + url.addQueryParameter( + if (tag.isIncluded()) "tags[include][]" else "tags[exclude][]", + tag.id, + ) + } + } + else -> {} + } + } + return POST(url.toString(), catalogHeaders()) + } + + // Filters + private class SearchFilter(name: String, val id: String) : Filter.TriState(name) + + private class TagList(tags: List) : Filter.Group("Теги", tags) + private class AgeList(ages: List) : Filter.Group("Возрастное ограничение", ages) + + override fun getFilterList(): FilterList { + val filters = super.getFilterList().toMutableList() + filters.add(4, TagList(getTagList())) + filters.add(7, AgeList(getAgeList())) + return FilterList(filters) + } + + private fun getTagList() = listOf( + SearchFilter("Азартные игры", "304"), + SearchFilter("Алхимия", "225"), + SearchFilter("Ангелы", "226"), + SearchFilter("Антигерой", "175"), + SearchFilter("Антиутопия", "227"), + SearchFilter("Апокалипсис", "228"), + SearchFilter("Армия", "229"), + SearchFilter("Артефакты", "230"), + SearchFilter("Боги", "215"), + SearchFilter("Бои на мечах", "231"), + SearchFilter("Борьба за власть", "231"), + SearchFilter("Брат и сестра", "233"), + SearchFilter("Будущее", "234"), + SearchFilter("Ведьма", "338"), + SearchFilter("Вестерн", "235"), + SearchFilter("Видеоигры", "185"), + SearchFilter("Виртуальная реальность", "195"), + SearchFilter("Владыка демонов", "236"), + SearchFilter("Военные", "179"), + SearchFilter("Война", "237"), + SearchFilter("Волшебники / маги", "281"), + SearchFilter("Волшебные существа", "239"), + SearchFilter("Воспоминания из другого мира", "240"), + SearchFilter("Выживание", "193"), + SearchFilter("ГГ женщина", "243"), + SearchFilter("ГГ имба", "291"), + SearchFilter("ГГ мужчина", "244"), + SearchFilter("Геймеры", "241"), + SearchFilter("Гильдии", "242"), + SearchFilter("Глупый ГГ", "297"), + SearchFilter("Гоблины", "245"), + SearchFilter("Горничные", "169"), + SearchFilter("Гяру", "178"), + SearchFilter("Демоны", "151"), + SearchFilter("Драконы", "246"), + SearchFilter("Дружба", "247"), + SearchFilter("Жестокий мир", "249"), + SearchFilter("Животные компаньоны", "250"), + SearchFilter("Завоевание мира", "251"), + SearchFilter("Зверолюди", "162"), + SearchFilter("Злые духи", "252"), + SearchFilter("Зомби", "149"), + SearchFilter("Игровые элементы", "253"), + SearchFilter("Империи", "254"), + SearchFilter("Квесты", "255"), + SearchFilter("Космос", "256"), + SearchFilter("Кулинария", "152"), + SearchFilter("Культивация", "160"), + SearchFilter("Легендарное оружие", "257"), + SearchFilter("Лоли", "187"), + SearchFilter("Магическая академия", "258"), + SearchFilter("Магия", "168"), + SearchFilter("Мафия", "172"), + SearchFilter("Медицина", "153"), + SearchFilter("Месть", "259"), + SearchFilter("Монстр Девушки", "188"), + SearchFilter("Монстры", "189"), + SearchFilter("Музыка", "190"), + SearchFilter("Навыки / способности", "260"), + SearchFilter("Насилие / жестокость", "262"), + SearchFilter("Наёмники", "261"), + SearchFilter("Нежить", "263"), + SearchFilter("Ниндая", "180"), + SearchFilter("Обратный Гарем", "191"), + SearchFilter("Огнестрельное оружие", "264"), + SearchFilter("Офисные Работники", "181"), + SearchFilter("Пародия", "265"), + SearchFilter("Пираты", "340"), + SearchFilter("Подземелья", "266"), + SearchFilter("Политика", "267"), + SearchFilter("Полиция", "182"), + SearchFilter("Преступники / Криминал", "186"), + SearchFilter("Призраки / Духи", "177"), + SearchFilter("Путешествие во времени", "194"), + SearchFilter("Разумные расы", "268"), + SearchFilter("Ранги силы", "248"), + SearchFilter("Реинкарнация", "148"), + SearchFilter("Роботы", "269"), + SearchFilter("Рыцари", "270"), + SearchFilter("Самураи", "183"), + SearchFilter("Система", "271"), + SearchFilter("Скрытие личности", "273"), + SearchFilter("Спасение мира", "274"), + SearchFilter("Спортивное тело", "334"), + SearchFilter("Средневековье", "173"), + SearchFilter("Стимпанк", "272"), + SearchFilter("Супергерои", "275"), + SearchFilter("Традиционные игры", "184"), + SearchFilter("Умный ГГ", "302"), + SearchFilter("Учитель / ученик", "276"), + SearchFilter("Философия", "277"), + SearchFilter("Хикикомори", "166"), + SearchFilter("Холодное оружие", "278"), + SearchFilter("Шантаж", "279"), + SearchFilter("Эльфы", "216"), + SearchFilter("Якудза", "164"), + SearchFilter("Япония", "280"), + + ) + + private fun getAgeList() = listOf( + SearchFilter("Отсутствует", "0"), + SearchFilter("16+", "1"), + SearchFilter("18+", "2"), + ) + + companion object { + const val PREFIX_SLUG_SEARCH = "slug:" + private const val DOMAIN_PREF = "MangaLibDomain" + private const val DOMAIN_PREF_Title = "Выбор домена" + } + + override fun setupPreferenceScreen(screen: PreferenceScreen) { + super.setupPreferenceScreen(screen) + ListPreference(screen.context).apply { + key = DOMAIN_PREF + title = DOMAIN_PREF_Title + entries = arrayOf("Основной (mangalib.me)", "Зеркало (mangalib.org)") + entryValues = arrayOf(baseOrig, baseMirr) + summary = "%s" + setDefaultValue(baseOrig) + setOnPreferenceChangeListener { _, newValue -> + try { + val res = preferences.edit().putString(DOMAIN_PREF, newValue as String).commit() + val warning = "Для смены домена необходимо перезапустить приложение с полной остановкой." + Toast.makeText(screen.context, warning, Toast.LENGTH_LONG).show() + res + } catch (e: Exception) { + e.printStackTrace() + false + } + } + }.let(screen::addPreference) + } +} diff --git a/multisrc/overrides/libgroup/yaoilib/AndroidManifest.xml b/multisrc/overrides/libgroup/yaoilib/AndroidManifest.xml new file mode 100644 index 000000000..7e728be99 --- /dev/null +++ b/multisrc/overrides/libgroup/yaoilib/AndroidManifest.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + + diff --git a/multisrc/overrides/libgroup/yaoilib/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/libgroup/yaoilib/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..6ec189440 Binary files /dev/null and b/multisrc/overrides/libgroup/yaoilib/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/libgroup/yaoilib/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/libgroup/yaoilib/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..716693c4a Binary files /dev/null and b/multisrc/overrides/libgroup/yaoilib/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/libgroup/yaoilib/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/libgroup/yaoilib/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..7f6f6ce53 Binary files /dev/null and b/multisrc/overrides/libgroup/yaoilib/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/libgroup/yaoilib/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/libgroup/yaoilib/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..9e921fb64 Binary files /dev/null and b/multisrc/overrides/libgroup/yaoilib/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/libgroup/yaoilib/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/libgroup/yaoilib/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..6dd288d16 Binary files /dev/null and b/multisrc/overrides/libgroup/yaoilib/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/libgroup/yaoilib/src/YaoiLib.kt b/multisrc/overrides/libgroup/yaoilib/src/YaoiLib.kt new file mode 100644 index 000000000..ae9af0cd8 --- /dev/null +++ b/multisrc/overrides/libgroup/yaoilib/src/YaoiLib.kt @@ -0,0 +1,197 @@ +package eu.kanade.tachiyomi.extension.ru.yaoilib + +import android.app.Application +import android.content.SharedPreferences +import android.widget.Toast +import androidx.preference.EditTextPreference +import eu.kanade.tachiyomi.multisrc.libgroup.LibGroup +import eu.kanade.tachiyomi.network.POST +import eu.kanade.tachiyomi.source.model.Filter +import eu.kanade.tachiyomi.source.model.FilterList +import okhttp3.Request +import uy.kohesive.injekt.Injekt +import uy.kohesive.injekt.api.get + +class YaoiLib : LibGroup("YaoiLib", "https://v1.slashlib.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 { + if (csrfToken.isEmpty()) { + val tokenResponse = client.newCall(popularMangaRequest(page)).execute() + val resBody = tokenResponse.body.string() + csrfToken = "_token\" content=\"(.*)\"".toRegex().find(resBody)!!.groups[1]!!.value + } + val url = super.searchMangaRequest(page, query, filters).url.newBuilder() + (if (filters.isEmpty()) getFilterList() else filters).forEach { filter -> + when (filter) { + is AgeList -> filter.state.forEach { age -> + if (age.state != Filter.TriState.STATE_IGNORE) { + url.addQueryParameter( + if (age.isIncluded()) "caution[include][]" else "caution[exclude][]", + age.id, + ) + } + } + is TagList -> filter.state.forEach { tag -> + if (tag.state != Filter.TriState.STATE_IGNORE) { + url.addQueryParameter( + if (tag.isIncluded()) "tags[include][]" else "tags[exclude][]", + tag.id, + ) + } + } + else -> {} + } + } + return POST(url.toString(), catalogHeaders()) + } + + // Filters + private class SearchFilter(name: String, val id: String) : Filter.TriState(name) + + private class TagList(tags: List) : Filter.Group("Теги", tags) + private class AgeList(ages: List) : Filter.Group("Возрастное ограничение", ages) + + override fun getFilterList(): FilterList { + val filters = super.getFilterList().toMutableList() + filters.add(4, TagList(getTagList())) + filters.add(7, AgeList(getAgeList())) + return FilterList(filters) + } + + private fun getTagList() = listOf( + SearchFilter("Азартные игры", "304"), + SearchFilter("Алхимия", "225"), + SearchFilter("Ангелы", "226"), + SearchFilter("Антигерой", "175"), + SearchFilter("Антиутопия", "227"), + SearchFilter("Апокалипсис", "228"), + SearchFilter("Армия", "229"), + SearchFilter("Артефакты", "230"), + SearchFilter("Боги", "215"), + SearchFilter("Бои на мечах", "231"), + SearchFilter("Борьба за власть", "231"), + SearchFilter("Брат и сестра", "233"), + SearchFilter("Будущее", "234"), + SearchFilter("Ведьма", "338"), + SearchFilter("Вестерн", "235"), + SearchFilter("Видеоигры", "185"), + SearchFilter("Виртуальная реальность", "195"), + SearchFilter("Владыка демонов", "236"), + SearchFilter("Военные", "179"), + SearchFilter("Война", "237"), + SearchFilter("Волшебники / маги", "281"), + SearchFilter("Волшебные существа", "239"), + SearchFilter("Воспоминания из другого мира", "240"), + SearchFilter("Выживание", "193"), + SearchFilter("ГГ женщина", "243"), + SearchFilter("ГГ имба", "291"), + SearchFilter("ГГ мужчина", "244"), + SearchFilter("Геймеры", "241"), + SearchFilter("Гильдии", "242"), + SearchFilter("Глупый ГГ", "297"), + SearchFilter("Гоблины", "245"), + SearchFilter("Горничные", "169"), + SearchFilter("Гяру", "178"), + SearchFilter("Демоны", "151"), + SearchFilter("Драконы", "246"), + SearchFilter("Дружба", "247"), + SearchFilter("Жестокий мир", "249"), + SearchFilter("Животные компаньоны", "250"), + SearchFilter("Завоевание мира", "251"), + SearchFilter("Зверолюди", "162"), + SearchFilter("Злые духи", "252"), + SearchFilter("Зомби", "149"), + SearchFilter("Игровые элементы", "253"), + SearchFilter("Империи", "254"), + SearchFilter("Квесты", "255"), + SearchFilter("Космос", "256"), + SearchFilter("Кулинария", "152"), + SearchFilter("Культивация", "160"), + SearchFilter("Легендарное оружие", "257"), + SearchFilter("Лоли", "187"), + SearchFilter("Магическая академия", "258"), + SearchFilter("Магия", "168"), + SearchFilter("Мафия", "172"), + SearchFilter("Медицина", "153"), + SearchFilter("Месть", "259"), + SearchFilter("Монстр Девушки", "188"), + SearchFilter("Монстры", "189"), + SearchFilter("Музыка", "190"), + SearchFilter("Навыки / способности", "260"), + SearchFilter("Насилие / жестокость", "262"), + SearchFilter("Наёмники", "261"), + SearchFilter("Нежить", "263"), + SearchFilter("Ниндая", "180"), + SearchFilter("Обратный Гарем", "191"), + SearchFilter("Огнестрельное оружие", "264"), + SearchFilter("Офисные Работники", "181"), + SearchFilter("Пародия", "265"), + SearchFilter("Пираты", "340"), + SearchFilter("Подземелья", "266"), + SearchFilter("Политика", "267"), + SearchFilter("Полиция", "182"), + SearchFilter("Преступники / Криминал", "186"), + SearchFilter("Призраки / Духи", "177"), + SearchFilter("Путешествие во времени", "194"), + SearchFilter("Разумные расы", "268"), + SearchFilter("Ранги силы", "248"), + SearchFilter("Реинкарнация", "148"), + SearchFilter("Роботы", "269"), + SearchFilter("Рыцари", "270"), + SearchFilter("Самураи", "183"), + SearchFilter("Система", "271"), + SearchFilter("Скрытие личности", "273"), + SearchFilter("Спасение мира", "274"), + SearchFilter("Спортивное тело", "334"), + SearchFilter("Средневековье", "173"), + SearchFilter("Стимпанк", "272"), + SearchFilter("Супергерои", "275"), + SearchFilter("Традиционные игры", "184"), + SearchFilter("Умный ГГ", "302"), + SearchFilter("Учитель / ученик", "276"), + SearchFilter("Философия", "277"), + SearchFilter("Хикикомори", "166"), + SearchFilter("Холодное оружие", "278"), + SearchFilter("Шантаж", "279"), + SearchFilter("Эльфы", "216"), + SearchFilter("Якудза", "164"), + SearchFilter("Япония", "280"), + + ) + + private fun getAgeList() = listOf( + SearchFilter("Отсутствует", "0"), + SearchFilter("16+", "1"), + SearchFilter("18+", "2"), + ) + + 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 -> + val warning = "Для смены домена необходимо перезапустить приложение с полной остановкой." + Toast.makeText(screen.context, warning, Toast.LENGTH_LONG).show() + true + } + }.let(screen::addPreference) + } + + companion object { + const val PREFIX_SLUG_SEARCH = "slug:" + + private const val DOMAIN_TITLE = "Домен" + private const val DOMAIN_DEFAULT = "https://v1.slashlib.me" + } +} diff --git a/multisrc/overrides/madara/adonisfansub/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/adonisfansub/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..c681f2016 Binary files /dev/null and b/multisrc/overrides/madara/adonisfansub/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/adonisfansub/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/adonisfansub/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..0fd5aa9ea Binary files /dev/null and b/multisrc/overrides/madara/adonisfansub/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/adonisfansub/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/adonisfansub/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..6207221bf Binary files /dev/null and b/multisrc/overrides/madara/adonisfansub/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/adonisfansub/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/adonisfansub/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..f1e5c8b87 Binary files /dev/null and b/multisrc/overrides/madara/adonisfansub/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/adonisfansub/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/adonisfansub/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..73493dc5a Binary files /dev/null and b/multisrc/overrides/madara/adonisfansub/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/adonisfansub/src/AdonisFansub.kt b/multisrc/overrides/madara/adonisfansub/src/AdonisFansub.kt new file mode 100644 index 000000000..4c21611b4 --- /dev/null +++ b/multisrc/overrides/madara/adonisfansub/src/AdonisFansub.kt @@ -0,0 +1,10 @@ +package eu.kanade.tachiyomi.extension.tr.adonisfansub + +import eu.kanade.tachiyomi.multisrc.madara.Madara +import eu.kanade.tachiyomi.network.GET +import okhttp3.Request + +class AdonisFansub : Madara("Adonis Fansub", "https://manga.adonisfansub.com", "tr") { + override fun popularMangaRequest(page: Int): Request = GET("$baseUrl/manga/page/$page/?m_orderby=views", headers) + override fun latestUpdatesRequest(page: Int): Request = GET("$baseUrl/manga/page/$page/?m_orderby=latest", headers) +} diff --git a/multisrc/overrides/madara/adultwebtoon/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/adultwebtoon/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..2e6ef5321 Binary files /dev/null and b/multisrc/overrides/madara/adultwebtoon/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/adultwebtoon/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/adultwebtoon/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..3c445161b Binary files /dev/null and b/multisrc/overrides/madara/adultwebtoon/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/adultwebtoon/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/adultwebtoon/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..6f48786bc Binary files /dev/null and b/multisrc/overrides/madara/adultwebtoon/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/adultwebtoon/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/adultwebtoon/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..f655aecc4 Binary files /dev/null and b/multisrc/overrides/madara/adultwebtoon/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/adultwebtoon/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/adultwebtoon/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..1c041d8c9 Binary files /dev/null and b/multisrc/overrides/madara/adultwebtoon/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/adultwebtoon/src/AdultWebtoon.kt b/multisrc/overrides/madara/adultwebtoon/src/AdultWebtoon.kt new file mode 100644 index 000000000..6723ba954 --- /dev/null +++ b/multisrc/overrides/madara/adultwebtoon/src/AdultWebtoon.kt @@ -0,0 +1,25 @@ +package eu.kanade.tachiyomi.extension.en.adultwebtoon + +import eu.kanade.tachiyomi.multisrc.madara.Madara +import eu.kanade.tachiyomi.network.GET +import okhttp3.CacheControl +import okhttp3.Request + +class AdultWebtoon : Madara("Adult Webtoon", "https://adultwebtoon.com", "en") { + override fun popularMangaRequest(page: Int): Request { + val pageSuffix = if (page != 1) "page/$page/" else "" + return GET( + "$baseUrl/manga/$pageSuffix?m_orderby=trending", + headers, + CacheControl.FORCE_NETWORK, + ) + } + override fun latestUpdatesRequest(page: Int): Request { + val pageSuffix = if (page != 1) "page/$page/" else "" + return GET( + "$baseUrl/manga/$pageSuffix?m_orderby=latest", + headers, + CacheControl.FORCE_NETWORK, + ) + } +} diff --git a/multisrc/overrides/madara/akimanga/src/Akimanga.kt b/multisrc/overrides/madara/akimanga/src/Akimanga.kt new file mode 100644 index 000000000..e831ade1d --- /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 000000000..b7fee1faf --- /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/allporncomic/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/allporncomic/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..d21ab32f3 Binary files /dev/null and b/multisrc/overrides/madara/allporncomic/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/allporncomic/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/allporncomic/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..f3565405e Binary files /dev/null and b/multisrc/overrides/madara/allporncomic/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/allporncomic/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/allporncomic/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..45847aad3 Binary files /dev/null and b/multisrc/overrides/madara/allporncomic/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/allporncomic/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/allporncomic/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..705f3c244 Binary files /dev/null and b/multisrc/overrides/madara/allporncomic/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/allporncomic/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/allporncomic/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..7313ccf92 Binary files /dev/null and b/multisrc/overrides/madara/allporncomic/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/allporncomic/src/AllPornComic.kt b/multisrc/overrides/madara/allporncomic/src/AllPornComic.kt new file mode 100644 index 000000000..5b5e54767 --- /dev/null +++ b/multisrc/overrides/madara/allporncomic/src/AllPornComic.kt @@ -0,0 +1,11 @@ +package eu.kanade.tachiyomi.extension.en.allporncomic + +import eu.kanade.tachiyomi.multisrc.madara.Madara +import eu.kanade.tachiyomi.network.GET +import okhttp3.Request + +class AllPornComic : Madara("AllPornComic", "https://allporncomic.com", "en") { + override fun popularMangaRequest(page: Int): Request = GET("$baseUrl/manga/page/$page/?m_orderby=views", headers) + override fun latestUpdatesRequest(page: Int): Request = GET("$baseUrl/manga/page/$page/?m_orderby=latest", headers) + override fun searchMangaNextPageSelector() = "a[rel=next]" +} diff --git a/multisrc/overrides/madara/amuy/src/Amuy.kt b/multisrc/overrides/madara/amuy/src/Amuy.kt new file mode 100644 index 000000000..b73010737 --- /dev/null +++ b/multisrc/overrides/madara/amuy/src/Amuy.kt @@ -0,0 +1,22 @@ +package eu.kanade.tachiyomi.extension.pt.amuy + +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 Amuy : Madara( + "Amuy", + "https://apenasmaisumyaoi.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/anikiga/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/anikiga/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..91c87cf21 Binary files /dev/null and b/multisrc/overrides/madara/anikiga/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/anikiga/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/anikiga/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..3debb4f1b Binary files /dev/null and b/multisrc/overrides/madara/anikiga/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/anikiga/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/anikiga/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..881a8588d Binary files /dev/null and b/multisrc/overrides/madara/anikiga/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/anikiga/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/anikiga/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..273b1695d Binary files /dev/null and b/multisrc/overrides/madara/anikiga/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/anikiga/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/anikiga/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..ea95bf720 Binary files /dev/null and b/multisrc/overrides/madara/anikiga/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/anikiga/src/Anikiga.kt b/multisrc/overrides/madara/anikiga/src/Anikiga.kt new file mode 100644 index 000000000..324b0da05 --- /dev/null +++ b/multisrc/overrides/madara/anikiga/src/Anikiga.kt @@ -0,0 +1,7 @@ +package eu.kanade.tachiyomi.extension.tr.anikiga + +import eu.kanade.tachiyomi.multisrc.madara.Madara +import java.text.SimpleDateFormat +import java.util.Locale + +class Anikiga : Madara("Anikiga", "https://anikiga.com", "tr", SimpleDateFormat("d MMMMM yyyy", Locale("tr"))) diff --git a/multisrc/overrides/madara/anisamanga/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/anisamanga/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..8fae637ea Binary files /dev/null and b/multisrc/overrides/madara/anisamanga/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/anisamanga/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/anisamanga/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..5bb12d9a4 Binary files /dev/null and b/multisrc/overrides/madara/anisamanga/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/anisamanga/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/anisamanga/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..13a213486 Binary files /dev/null and b/multisrc/overrides/madara/anisamanga/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/anisamanga/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/anisamanga/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..10faa167d Binary files /dev/null and b/multisrc/overrides/madara/anisamanga/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/anisamanga/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/anisamanga/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..bb900891e Binary files /dev/null and b/multisrc/overrides/madara/anisamanga/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/anshscans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/anshscans/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..6aabc6940 Binary files /dev/null and b/multisrc/overrides/madara/anshscans/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/anshscans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/anshscans/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..9b1b2acdc Binary files /dev/null and b/multisrc/overrides/madara/anshscans/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/anshscans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/anshscans/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..3df52cec7 Binary files /dev/null and b/multisrc/overrides/madara/anshscans/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/anshscans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/anshscans/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..dd8bc3413 Binary files /dev/null and b/multisrc/overrides/madara/anshscans/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/anshscans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/anshscans/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..b93e08e4d Binary files /dev/null and b/multisrc/overrides/madara/anshscans/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/anshscans/src/AnshScans.kt b/multisrc/overrides/madara/anshscans/src/AnshScans.kt new file mode 100644 index 000000000..e17bead31 --- /dev/null +++ b/multisrc/overrides/madara/anshscans/src/AnshScans.kt @@ -0,0 +1,11 @@ +package eu.kanade.tachiyomi.extension.en.anshscans + +import eu.kanade.tachiyomi.multisrc.madara.Madara + +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/apollcomics/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/apollcomics/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..043f16224 Binary files /dev/null and b/multisrc/overrides/madara/apollcomics/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/apollcomics/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/apollcomics/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..f1b21df9f Binary files /dev/null and b/multisrc/overrides/madara/apollcomics/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/apollcomics/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/apollcomics/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..59a9176ab Binary files /dev/null and b/multisrc/overrides/madara/apollcomics/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/apollcomics/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/apollcomics/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..9700ab099 Binary files /dev/null and b/multisrc/overrides/madara/apollcomics/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/apollcomics/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/apollcomics/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..d274747da Binary files /dev/null and b/multisrc/overrides/madara/apollcomics/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/apollcomics/src/ApollComics.kt b/multisrc/overrides/madara/apollcomics/src/ApollComics.kt new file mode 100644 index 000000000..6f66f2c8b --- /dev/null +++ b/multisrc/overrides/madara/apollcomics/src/ApollComics.kt @@ -0,0 +1,7 @@ +package eu.kanade.tachiyomi.extension.es.apollcomics + +import eu.kanade.tachiyomi.multisrc.madara.Madara +import java.text.SimpleDateFormat +import java.util.Locale + +class ApollComics : Madara("ApollComics", "https://apollcomics.xyz", "es", SimpleDateFormat("dd MMMM, yyyy", Locale("es"))) diff --git a/multisrc/overrides/madara/apolltoons/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/apolltoons/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..ff10d56b7 Binary files /dev/null and b/multisrc/overrides/madara/apolltoons/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/apolltoons/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/apolltoons/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..9c9da2ed3 Binary files /dev/null and b/multisrc/overrides/madara/apolltoons/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/apolltoons/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/apolltoons/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..5fe58ac55 Binary files /dev/null and b/multisrc/overrides/madara/apolltoons/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/apolltoons/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/apolltoons/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..32188cbeb Binary files /dev/null and b/multisrc/overrides/madara/apolltoons/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/apolltoons/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/apolltoons/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..93862831c Binary files /dev/null and b/multisrc/overrides/madara/apolltoons/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/apolltoons/src/Apolltoons.kt b/multisrc/overrides/madara/apolltoons/src/Apolltoons.kt new file mode 100644 index 000000000..8e7ab8cb3 --- /dev/null +++ b/multisrc/overrides/madara/apolltoons/src/Apolltoons.kt @@ -0,0 +1,7 @@ +package eu.kanade.tachiyomi.extension.es.apolltoons + +import eu.kanade.tachiyomi.multisrc.madara.Madara +import java.text.SimpleDateFormat +import java.util.Locale + +class Apolltoons : Madara("Apolltoons", "https://apolltoons.xyz", "es", SimpleDateFormat("dd MMMMM, yyyy", Locale("es"))) diff --git a/multisrc/overrides/madara/aquamanga/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/aquamanga/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..f13a50fe3 Binary files /dev/null and b/multisrc/overrides/madara/aquamanga/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/aquamanga/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/aquamanga/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..5c7f53941 Binary files /dev/null and b/multisrc/overrides/madara/aquamanga/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/aquamanga/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/aquamanga/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..f7a31fea9 Binary files /dev/null and b/multisrc/overrides/madara/aquamanga/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/aquamanga/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/aquamanga/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..d66dfa6ad Binary files /dev/null and b/multisrc/overrides/madara/aquamanga/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/aquamanga/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/aquamanga/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..1d62fb58a Binary files /dev/null and b/multisrc/overrides/madara/aquamanga/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/aquamanga/src/AquaManga.kt b/multisrc/overrides/madara/aquamanga/src/AquaManga.kt new file mode 100644 index 000000000..3304e6eb9 --- /dev/null +++ b/multisrc/overrides/madara/aquamanga/src/AquaManga.kt @@ -0,0 +1,51 @@ +package eu.kanade.tachiyomi.extension.en.aquamanga + +import android.util.Base64 +import eu.kanade.tachiyomi.multisrc.madara.Madara +import okhttp3.Headers +import kotlin.random.Random + +class AquaManga : Madara("Aqua Manga", "https://aquamanga.org", "en") { + override val useNewChapterEndpoint = false + + override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/" + + override fun headersBuilder(): Headers.Builder = super.headersBuilder() + .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/arabtoons/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/arabtoons/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..f9607e724 Binary files /dev/null and b/multisrc/overrides/madara/arabtoons/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/arabtoons/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/arabtoons/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..443bcbca1 Binary files /dev/null and b/multisrc/overrides/madara/arabtoons/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/arabtoons/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/arabtoons/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..c093a3bac Binary files /dev/null and b/multisrc/overrides/madara/arabtoons/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/arabtoons/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/arabtoons/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..094e05f82 Binary files /dev/null and b/multisrc/overrides/madara/arabtoons/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/arabtoons/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/arabtoons/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..d1ef24278 Binary files /dev/null and b/multisrc/overrides/madara/arabtoons/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/arabtoons/src/ArabToons.kt b/multisrc/overrides/madara/arabtoons/src/ArabToons.kt new file mode 100644 index 000000000..9acadf3a2 --- /dev/null +++ b/multisrc/overrides/madara/arabtoons/src/ArabToons.kt @@ -0,0 +1,14 @@ +package eu.kanade.tachiyomi.extension.ar.arabtoons + +import eu.kanade.tachiyomi.multisrc.madara.Madara +import java.text.SimpleDateFormat +import java.util.Locale + +class ArabToons : Madara( + "عرب تونز", + "https://arabtoons.net", + "ar", + dateFormat = SimpleDateFormat("MMM d", Locale("ar")), +) { + override val useNewChapterEndpoint = true +} diff --git a/multisrc/overrides/madara/araznovel/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/araznovel/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..dd583b384 Binary files /dev/null and b/multisrc/overrides/madara/araznovel/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/araznovel/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/araznovel/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..02678533e Binary files /dev/null and b/multisrc/overrides/madara/araznovel/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/araznovel/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/araznovel/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..eee10ded1 Binary files /dev/null and b/multisrc/overrides/madara/araznovel/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/araznovel/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/araznovel/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..0a17a4d35 Binary files /dev/null and b/multisrc/overrides/madara/araznovel/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/araznovel/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/araznovel/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..6d84e6064 Binary files /dev/null and b/multisrc/overrides/madara/araznovel/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/araznovel/src/ArazNovel.kt b/multisrc/overrides/madara/araznovel/src/ArazNovel.kt new file mode 100644 index 000000000..a26379ba8 --- /dev/null +++ b/multisrc/overrides/madara/araznovel/src/ArazNovel.kt @@ -0,0 +1,31 @@ +package eu.kanade.tachiyomi.extension.tr.araznovel + +import eu.kanade.tachiyomi.multisrc.madara.Madara +import eu.kanade.tachiyomi.source.model.SChapter +import eu.kanade.tachiyomi.util.asJsoup +import okhttp3.Response +import java.text.SimpleDateFormat +import java.util.Locale + +class ArazNovel : Madara("ArazNovel", "https://www.araznovel.com", "tr", SimpleDateFormat("dd/MM/yyyy", Locale.getDefault())) { + + override fun chapterListParse(response: Response): List { + val document = response.asJsoup() + val mangaId = document.select("div#manga-chapters-holder").attr("data-id") + + val xhrRequest = oldXhrChaptersRequest(mangaId) + val xhrResponse = client.newCall(xhrRequest).execute() + + return xhrResponse.asJsoup().let { xhrDocument -> + xhrDocument.select("li.parent").let { elements -> + if (!elements.isNullOrEmpty()) { + elements.reversed() + .map { volumeElement -> volumeElement.select(chapterListSelector()).map { chapterFromElement(it) } } + .flatten() + } else { + xhrDocument.select(chapterListSelector()).map { chapterFromElement(it) } + } + } + } + } +} diff --git a/multisrc/overrides/madara/arcanescans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/arcanescans/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..03cd46e0c Binary files /dev/null and b/multisrc/overrides/madara/arcanescans/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/arcanescans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/arcanescans/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..725c72173 Binary files /dev/null and b/multisrc/overrides/madara/arcanescans/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/arcanescans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/arcanescans/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..77b4aa13b Binary files /dev/null and b/multisrc/overrides/madara/arcanescans/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/arcanescans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/arcanescans/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..c510c3627 Binary files /dev/null and b/multisrc/overrides/madara/arcanescans/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/arcanescans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/arcanescans/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..52e0aaec1 Binary files /dev/null and b/multisrc/overrides/madara/arcanescans/res/mipmap-xxxhdpi/ic_launcher.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 000000000..aa0cca8ed --- /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/arthurscan/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/arthurscan/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..aa6b2f81b Binary files /dev/null and b/multisrc/overrides/madara/arthurscan/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/arthurscan/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/arthurscan/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..a733aee3a Binary files /dev/null and b/multisrc/overrides/madara/arthurscan/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/arthurscan/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/arthurscan/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..e46e3b6a5 Binary files /dev/null and b/multisrc/overrides/madara/arthurscan/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/arthurscan/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/arthurscan/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..c9f538a35 Binary files /dev/null and b/multisrc/overrides/madara/arthurscan/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/arthurscan/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/arthurscan/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..82800f12a Binary files /dev/null and b/multisrc/overrides/madara/arthurscan/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/arthurscan/src/ArthurScan.kt b/multisrc/overrides/madara/arthurscan/src/ArthurScan.kt new file mode 100644 index 000000000..afa7a762f --- /dev/null +++ b/multisrc/overrides/madara/arthurscan/src/ArthurScan.kt @@ -0,0 +1,22 @@ +package eu.kanade.tachiyomi.extension.pt.arthurscan + +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 ArthurScan : Madara( + "Arthur Scan", + "https://arthurscan.xyz", + "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/astrallibrary/src/AstralLibrary.kt b/multisrc/overrides/madara/astrallibrary/src/AstralLibrary.kt new file mode 100644 index 000000000..290560d34 --- /dev/null +++ b/multisrc/overrides/madara/astrallibrary/src/AstralLibrary.kt @@ -0,0 +1,17 @@ +package eu.kanade.tachiyomi.extension.en.astrallibrary + +import eu.kanade.tachiyomi.multisrc.madara.Madara +import eu.kanade.tachiyomi.network.GET +import okhttp3.Request +import java.text.SimpleDateFormat +import java.util.Locale + +class AstralLibrary : Madara("Astral Library", "https://www.astrallibrary.net", "en", SimpleDateFormat("d MMM", Locale.US)) { + override fun popularMangaRequest(page: Int): Request { + return GET("$baseUrl/manga-tag/manga/?m_orderby=views&page=$page", headers) + } + + override fun latestUpdatesRequest(page: Int): Request { + return GET("$baseUrl/manga-tag/manga/?m_orderby=latest&page=$page", headers) + } +} diff --git a/multisrc/overrides/madara/astralmanga/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/astralmanga/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..d699c812b Binary files /dev/null and b/multisrc/overrides/madara/astralmanga/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/astralmanga/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/astralmanga/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..6b6955a3c Binary files /dev/null and b/multisrc/overrides/madara/astralmanga/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/astralmanga/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/astralmanga/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..0ddce99c6 Binary files /dev/null and b/multisrc/overrides/madara/astralmanga/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/astralmanga/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/astralmanga/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..f7606c39d Binary files /dev/null and b/multisrc/overrides/madara/astralmanga/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/astralmanga/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/astralmanga/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..1cda1bb6c Binary files /dev/null and b/multisrc/overrides/madara/astralmanga/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/astralmanga/src/AstralManga.kt b/multisrc/overrides/madara/astralmanga/src/AstralManga.kt new file mode 100644 index 000000000..639893902 --- /dev/null +++ b/multisrc/overrides/madara/astralmanga/src/AstralManga.kt @@ -0,0 +1,9 @@ +package eu.kanade.tachiyomi.extension.fr.astralmanga + +import eu.kanade.tachiyomi.multisrc.madara.Madara +import java.text.SimpleDateFormat +import java.util.Locale + +class AstralManga : Madara("AstralManga", "https://astral-manga.fr", "fr", dateFormat = SimpleDateFormat("dd/mm/yyyy", Locale.FRANCE)) { + override val useNewChapterEndpoint = true +} diff --git a/multisrc/overrides/madara/astrumscans/src/AstrumScans.kt b/multisrc/overrides/madara/astrumscans/src/AstrumScans.kt new file mode 100644 index 000000000..5c994d76a --- /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 000000000..9866f55db 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 000000000..4ef6d7936 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 000000000..e0a3e8840 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 000000000..2da953a2f 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 000000000..7516a2dba Binary files /dev/null and b/multisrc/overrides/madara/asurascansus/res/mipmap-xxxhdpi/ic_launcher.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 000000000..5e1b63b87 --- /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/atlantisscan/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/atlantisscan/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..9a0ff5030 Binary files /dev/null and b/multisrc/overrides/madara/atlantisscan/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/atlantisscan/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/atlantisscan/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..1fdd68678 Binary files /dev/null and b/multisrc/overrides/madara/atlantisscan/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/atlantisscan/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/atlantisscan/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..cb1cb6c5b Binary files /dev/null and b/multisrc/overrides/madara/atlantisscan/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/atlantisscan/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/atlantisscan/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..1bf18ecd9 Binary files /dev/null and b/multisrc/overrides/madara/atlantisscan/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/atlantisscan/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/atlantisscan/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..7ee33ad39 Binary files /dev/null and b/multisrc/overrides/madara/atlantisscan/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/atlantisscan/src/AtlantisScan.kt b/multisrc/overrides/madara/atlantisscan/src/AtlantisScan.kt new file mode 100644 index 000000000..a8d1bc3b9 --- /dev/null +++ b/multisrc/overrides/madara/atlantisscan/src/AtlantisScan.kt @@ -0,0 +1,62 @@ +package eu.kanade.tachiyomi.extension.es.atlantisscan + +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.OkHttpClient +import okhttp3.Request +import java.text.SimpleDateFormat +import java.util.Locale +import java.util.concurrent.TimeUnit + +class AtlantisScan : Madara( + "Atlantis Scan", + "https://scansatlanticos.com", + "es", + dateFormat = SimpleDateFormat("dd/MM/yyyy", Locale.US), +) { + override val id: Long = 2237642340381856331 + + override val client: OkHttpClient = 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[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/azora/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/azora/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..1e0f7d586 Binary files /dev/null and b/multisrc/overrides/madara/azora/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/azora/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/azora/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..ae77629f0 Binary files /dev/null and b/multisrc/overrides/madara/azora/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/azora/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/azora/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..9607f5baa Binary files /dev/null and b/multisrc/overrides/madara/azora/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/azora/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/azora/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..c9f2b8e9e Binary files /dev/null and b/multisrc/overrides/madara/azora/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/azora/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/azora/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..02c13569b Binary files /dev/null and b/multisrc/overrides/madara/azora/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/azora/src/Azora.kt b/multisrc/overrides/madara/azora/src/Azora.kt new file mode 100644 index 000000000..040bf03fc --- /dev/null +++ b/multisrc/overrides/madara/azora/src/Azora.kt @@ -0,0 +1,24 @@ +package eu.kanade.tachiyomi.extension.ar.azora + +import eu.kanade.tachiyomi.multisrc.madara.Madara +import eu.kanade.tachiyomi.network.GET +import eu.kanade.tachiyomi.source.model.SChapter +import okhttp3.Request +import org.jsoup.nodes.Element + +class Azora : Madara("Azora", "https://azoramoon.com", "ar") { + override val mangaSubString = "series" + override val useNewChapterEndpoint = false + override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/" + override fun popularMangaRequest(page: Int): Request = GET("$baseUrl/page/$page/?m_orderby=views", headers) + override fun chapterListSelector() = "li.wp-manga-chapter:not(.premium-block)" // Filter fake chapters + override fun chapterFromElement(element: Element): SChapter { + val chapter = SChapter.create() + + element.select("a").let { + chapter.url = it.attr("href").substringAfter(baseUrl) + chapter.name = it.text() + } + return chapter + } +} diff --git a/multisrc/overrides/madara/babelwuxia/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/babelwuxia/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..d895bc948 Binary files /dev/null and b/multisrc/overrides/madara/babelwuxia/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/babelwuxia/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/babelwuxia/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..9df29f5c6 Binary files /dev/null and b/multisrc/overrides/madara/babelwuxia/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/babelwuxia/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/babelwuxia/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..eab945677 Binary files /dev/null and b/multisrc/overrides/madara/babelwuxia/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/babelwuxia/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/babelwuxia/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..6eb4a3dcc Binary files /dev/null and b/multisrc/overrides/madara/babelwuxia/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/babelwuxia/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/babelwuxia/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..84945684c Binary files /dev/null and b/multisrc/overrides/madara/babelwuxia/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/babelwuxia/src/BabelWuxia.kt b/multisrc/overrides/madara/babelwuxia/src/BabelWuxia.kt new file mode 100644 index 000000000..832949a70 --- /dev/null +++ b/multisrc/overrides/madara/babelwuxia/src/BabelWuxia.kt @@ -0,0 +1,37 @@ +package eu.kanade.tachiyomi.extension.en.babelwuxia + +import eu.kanade.tachiyomi.multisrc.madara.Madara +import eu.kanade.tachiyomi.source.model.MangasPage +import okhttp3.Response + +class BabelWuxia : Madara("Babel Wuxia", "https://babelwuxia.com", "en") { + + // moved from MangaThemesia + override val versionId = 2 + 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/bakaman/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/bakaman/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..4f0f78899 Binary files /dev/null and b/multisrc/overrides/madara/bakaman/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/bakaman/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/bakaman/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..dc580cbbd Binary files /dev/null and b/multisrc/overrides/madara/bakaman/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/bakaman/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/bakaman/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..49054ae80 Binary files /dev/null and b/multisrc/overrides/madara/bakaman/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/bakaman/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/bakaman/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..8e08a9ba7 Binary files /dev/null and b/multisrc/overrides/madara/bakaman/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/bakaman/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/bakaman/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..c269d30b4 Binary files /dev/null and b/multisrc/overrides/madara/bakaman/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/bakamh/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/bakamh/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..71251ac05 Binary files /dev/null and b/multisrc/overrides/madara/bakamh/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/bakamh/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/bakamh/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..4db8baa72 Binary files /dev/null and b/multisrc/overrides/madara/bakamh/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/bakamh/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/bakamh/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..14d71c191 Binary files /dev/null and b/multisrc/overrides/madara/bakamh/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/bakamh/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/bakamh/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..68a328ed3 Binary files /dev/null and b/multisrc/overrides/madara/bakamh/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/bakamh/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/bakamh/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..e61ae6ca9 Binary files /dev/null and b/multisrc/overrides/madara/bakamh/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/bakamh/src/Bakamh.kt b/multisrc/overrides/madara/bakamh/src/Bakamh.kt new file mode 100644 index 000000000..1c672462d --- /dev/null +++ b/multisrc/overrides/madara/bakamh/src/Bakamh.kt @@ -0,0 +1,14 @@ +package eu.kanade.tachiyomi.extension.zh.bakamh + +import eu.kanade.tachiyomi.multisrc.madara.Madara +import java.text.SimpleDateFormat +import java.util.Locale + +class Bakamh : Madara( + "巴卡漫画", + "https://bakamh.com", + "zh", + SimpleDateFormat("yyyy 年 M 月 d 日", Locale.CHINESE), +) { + override val mangaDetailsSelectorStatus = ".post-content_item:contains(状态) .summary-content" +} 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 000000000..f84457b58 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 000000000..c242b942b 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 000000000..7dcd02bb8 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 000000000..2e0a5c8da 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 000000000..6800241db Binary files /dev/null and b/multisrc/overrides/madara/bananamanga/res/mipmap-xxxhdpi/ic_launcher.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 000000000..dcadac1e9 --- /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 000000000..2d7052075 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 000000000..b8329e9ca 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 000000000..902e1347d 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 000000000..f68cd3571 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 000000000..dc81d0d27 Binary files /dev/null and b/multisrc/overrides/madara/barmanga/res/mipmap-xxxhdpi/ic_launcher.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 000000000..17c6d91e5 --- /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/bestmanga/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/bestmanga/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..9132c655e Binary files /dev/null and b/multisrc/overrides/madara/bestmanga/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/bestmanga/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/bestmanga/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..30c1ce95d Binary files /dev/null and b/multisrc/overrides/madara/bestmanga/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/bestmanga/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/bestmanga/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..e60df3b61 Binary files /dev/null and b/multisrc/overrides/madara/bestmanga/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/bestmanga/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/bestmanga/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..268b96f11 Binary files /dev/null and b/multisrc/overrides/madara/bestmanga/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/bestmanga/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/bestmanga/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..04cc46874 Binary files /dev/null and b/multisrc/overrides/madara/bestmanga/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/bestmanga/src/BestManga.kt b/multisrc/overrides/madara/bestmanga/src/BestManga.kt new file mode 100644 index 000000000..76fb943fb --- /dev/null +++ b/multisrc/overrides/madara/bestmanga/src/BestManga.kt @@ -0,0 +1,7 @@ +package eu.kanade.tachiyomi.extension.ru.bestmanga + +import eu.kanade.tachiyomi.multisrc.madara.Madara +import java.text.SimpleDateFormat +import java.util.Locale + +class BestManga : Madara("BestManga", "https://bestmanga.club", "ru", SimpleDateFormat("dd.MM.yyyy", Locale.getDefault())) diff --git a/multisrc/overrides/madara/bestmanhua/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/bestmanhua/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..dc5c285a4 Binary files /dev/null and b/multisrc/overrides/madara/bestmanhua/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/bestmanhua/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/bestmanhua/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..790189a23 Binary files /dev/null and b/multisrc/overrides/madara/bestmanhua/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/bestmanhua/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/bestmanhua/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..c363df261 Binary files /dev/null and b/multisrc/overrides/madara/bestmanhua/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/bestmanhua/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/bestmanhua/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..15096c2c7 Binary files /dev/null and b/multisrc/overrides/madara/bestmanhua/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/bestmanhua/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/bestmanhua/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..09dbdbf16 Binary files /dev/null and b/multisrc/overrides/madara/bestmanhua/res/mipmap-xxxhdpi/ic_launcher.png differ 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 000000000..aff88e025 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 000000000..9fd3c5155 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 000000000..1a21fd20b 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 000000000..7b06cb268 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 000000000..e11f6fecc Binary files /dev/null and b/multisrc/overrides/madara/birdtoon/res/mipmap-xxxhdpi/ic_launcher.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 000000000..59cb32059 --- /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/bluesolo/src/BlueSolo.kt b/multisrc/overrides/madara/bluesolo/src/BlueSolo.kt new file mode 100644 index 000000000..03b1e65c4 --- /dev/null +++ b/multisrc/overrides/madara/bluesolo/src/BlueSolo.kt @@ -0,0 +1,9 @@ +package eu.kanade.tachiyomi.extension.fr.bluesolo + +import eu.kanade.tachiyomi.multisrc.madara.Madara +import java.text.SimpleDateFormat +import java.util.Locale + +class BlueSolo : Madara("Blue Solo", "https://www1.bluesolo.org", "fr", dateFormat = SimpleDateFormat("d MMMM yyyy", Locale.FRENCH)) { + override val mangaDetailsSelectorStatus = "div.summary-heading:contains(Statut) + .summary-content" +} diff --git a/multisrc/overrides/madara/bokugentranslation/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/bokugentranslation/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..d48bf43d4 Binary files /dev/null and b/multisrc/overrides/madara/bokugentranslation/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/bokugentranslation/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/bokugentranslation/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..2d9223248 Binary files /dev/null and b/multisrc/overrides/madara/bokugentranslation/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/bokugentranslation/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/bokugentranslation/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..32e4f78c6 Binary files /dev/null and b/multisrc/overrides/madara/bokugentranslation/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/bokugentranslation/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/bokugentranslation/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..532304cfa Binary files /dev/null and b/multisrc/overrides/madara/bokugentranslation/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/bokugentranslation/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/bokugentranslation/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..628e3b643 Binary files /dev/null and b/multisrc/overrides/madara/bokugentranslation/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/bokugentranslation/src/BokugenTranslation.kt b/multisrc/overrides/madara/bokugentranslation/src/BokugenTranslation.kt new file mode 100644 index 000000000..4e0443609 --- /dev/null +++ b/multisrc/overrides/madara/bokugentranslation/src/BokugenTranslation.kt @@ -0,0 +1,61 @@ +package eu.kanade.tachiyomi.extension.es.bokugentranslation + +import android.app.Application +import android.os.Handler +import android.os.Looper +import android.view.View +import android.webkit.WebChromeClient +import android.webkit.WebView +import eu.kanade.tachiyomi.multisrc.madara.Madara +import eu.kanade.tachiyomi.network.interceptor.rateLimit +import okhttp3.OkHttpClient +import uy.kohesive.injekt.Injekt +import uy.kohesive.injekt.api.get +import java.text.SimpleDateFormat +import java.util.Locale +import java.util.concurrent.CountDownLatch + +class BokugenTranslation : Madara( + "BokugenTranslation", + "https://bokugents.com", + "es", + dateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale("es")), +) { + private var loadWebView = true + override val client: OkHttpClient = super.client.newBuilder() + .addInterceptor { chain -> + val request = chain.request() + val url = request.url.toString() + if (loadWebView) { + val handler = Handler(Looper.getMainLooper()) + val latch = CountDownLatch(1) + var webView: WebView? = null + handler.post { + val webview = WebView(Injekt.get()) + webView = webview + webview.settings.domStorageEnabled = true + webview.setLayerType(View.LAYER_TYPE_SOFTWARE, null) + webview.settings.useWideViewPort = false + webview.settings.loadWithOverviewMode = false + + webview.webChromeClient = object : WebChromeClient() { + override fun onProgressChanged(view: WebView?, newProgress: Int) { + if (newProgress == 100) { + latch.countDown() + } + } + } + webview.loadUrl(url) + } + + latch.await() + loadWebView = false + handler.post { webView?.destroy() } + } + chain.proceed(request) + } + .rateLimit(1, 1) + .build() + + override val useNewChapterEndpoint = true +} diff --git a/multisrc/overrides/madara/borutoexplorer/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/borutoexplorer/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..2040e7e8b Binary files /dev/null and b/multisrc/overrides/madara/borutoexplorer/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/borutoexplorer/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/borutoexplorer/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..bf83d22a0 Binary files /dev/null and b/multisrc/overrides/madara/borutoexplorer/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/borutoexplorer/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/borutoexplorer/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..ba987fced Binary files /dev/null and b/multisrc/overrides/madara/borutoexplorer/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/borutoexplorer/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/borutoexplorer/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..ba59bd63b Binary files /dev/null and b/multisrc/overrides/madara/borutoexplorer/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/borutoexplorer/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/borutoexplorer/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..6c810d1af Binary files /dev/null and b/multisrc/overrides/madara/borutoexplorer/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/borutoexplorer/src/BorutoExplorer.kt b/multisrc/overrides/madara/borutoexplorer/src/BorutoExplorer.kt new file mode 100644 index 000000000..d9968b166 --- /dev/null +++ b/multisrc/overrides/madara/borutoexplorer/src/BorutoExplorer.kt @@ -0,0 +1,20 @@ +package eu.kanade.tachiyomi.extension.pt.borutoexplorer + +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 BorutoExplorer : Madara( + "Boruto Explorer", + "https://leitor.borutoexplorer.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/boyslove/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/boyslove/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..9933a7ecb Binary files /dev/null and b/multisrc/overrides/madara/boyslove/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/boyslove/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/boyslove/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..84f92b836 Binary files /dev/null and b/multisrc/overrides/madara/boyslove/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/boyslove/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/boyslove/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..7576b766f Binary files /dev/null and b/multisrc/overrides/madara/boyslove/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/boyslove/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/boyslove/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..386ef0c0d Binary files /dev/null and b/multisrc/overrides/madara/boyslove/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/boyslove/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/boyslove/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..f076f3316 Binary files /dev/null and b/multisrc/overrides/madara/boyslove/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/cafecomyaoi/src/CafeComYaoi.kt b/multisrc/overrides/madara/cafecomyaoi/src/CafeComYaoi.kt new file mode 100644 index 000000000..5323d04b5 --- /dev/null +++ b/multisrc/overrides/madara/cafecomyaoi/src/CafeComYaoi.kt @@ -0,0 +1,20 @@ +package eu.kanade.tachiyomi.extension.pt.cafecomyaoi + +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 CafeComYaoi : Madara( + "Café com Yaoi", + "http://cafecomyaoi.com.br", + "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/cat300/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/cat300/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..7b0b86953 Binary files /dev/null and b/multisrc/overrides/madara/cat300/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/cat300/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/cat300/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..fbf3b2d93 Binary files /dev/null and b/multisrc/overrides/madara/cat300/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/cat300/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/cat300/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..debb0df36 Binary files /dev/null and b/multisrc/overrides/madara/cat300/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/cat300/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/cat300/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..945b27b0a Binary files /dev/null and b/multisrc/overrides/madara/cat300/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/cat300/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/cat300/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..da34dcf09 Binary files /dev/null and b/multisrc/overrides/madara/cat300/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/cattranslator/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/cattranslator/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..d68929218 Binary files /dev/null and b/multisrc/overrides/madara/cattranslator/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/cattranslator/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/cattranslator/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..fa8ea9499 Binary files /dev/null and b/multisrc/overrides/madara/cattranslator/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/cattranslator/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/cattranslator/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..ac01aaf22 Binary files /dev/null and b/multisrc/overrides/madara/cattranslator/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/cattranslator/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/cattranslator/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..3d00dc395 Binary files /dev/null and b/multisrc/overrides/madara/cattranslator/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/cattranslator/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/cattranslator/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..a16ed0dc9 Binary files /dev/null and b/multisrc/overrides/madara/cattranslator/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/cattranslator/src/CatTranslator.kt b/multisrc/overrides/madara/cattranslator/src/CatTranslator.kt new file mode 100644 index 000000000..02547066c --- /dev/null +++ b/multisrc/overrides/madara/cattranslator/src/CatTranslator.kt @@ -0,0 +1,33 @@ +package eu.kanade.tachiyomi.extension.th.cattranslator + +import eu.kanade.tachiyomi.multisrc.madara.Madara +import eu.kanade.tachiyomi.source.model.SManga +import org.jsoup.nodes.Element + +class CatTranslator : Madara( + "CAT-translator", + "https://cats-translator.com/manga", + "th", +) { + private fun parseMangaFromElement(element: Element, isSearch: Boolean): SManga { + val manga = SManga.create() + + with(element) { + select(if (isSearch) "div.post-title a" else popularMangaUrlSelector).first()?.let { + manga.setUrlWithoutDomain(it.attr("abs:href")) + manga.url = manga.url.removePrefix("/manga") + manga.title = it.ownText() + } + + select("img").first()?.let { + manga.thumbnail_url = imageFromElement(it) + } + } + + return manga + } + + override fun popularMangaFromElement(element: Element) = parseMangaFromElement(element, false) + + override fun searchMangaFromElement(element: Element) = parseMangaFromElement(element, true) +} diff --git a/multisrc/overrides/madara/cerisescans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/cerisescans/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..baf511018 Binary files /dev/null and b/multisrc/overrides/madara/cerisescans/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/cerisescans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/cerisescans/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..a2d6228db Binary files /dev/null and b/multisrc/overrides/madara/cerisescans/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/cerisescans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/cerisescans/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..70b13326d Binary files /dev/null and b/multisrc/overrides/madara/cerisescans/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/cerisescans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/cerisescans/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..a6c37657d Binary files /dev/null and b/multisrc/overrides/madara/cerisescans/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/cerisescans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/cerisescans/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..be4fcce7b Binary files /dev/null and b/multisrc/overrides/madara/cerisescans/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/cerisescans/src/CeriseScan.kt b/multisrc/overrides/madara/cerisescans/src/CeriseScan.kt new file mode 100644 index 000000000..5c99fcdce --- /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/chibimanga/src/ChibiManga.kt b/multisrc/overrides/madara/chibimanga/src/ChibiManga.kt new file mode 100644 index 000000000..571f1c479 --- /dev/null +++ b/multisrc/overrides/madara/chibimanga/src/ChibiManga.kt @@ -0,0 +1,7 @@ +package eu.kanade.tachiyomi.extension.en.chibimanga + +import eu.kanade.tachiyomi.multisrc.madara.Madara +import java.text.SimpleDateFormat +import java.util.Locale + +class ChibiManga : Madara("Chibi Manga", "https://www.cmreader.info", "en", dateFormat = SimpleDateFormat("MMM dd, yyyy", Locale.US)) diff --git a/multisrc/overrides/madara/cizgiromanarsivi/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/cizgiromanarsivi/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..45cf129d5 Binary files /dev/null and b/multisrc/overrides/madara/cizgiromanarsivi/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/cizgiromanarsivi/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/cizgiromanarsivi/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..ea6aae86d Binary files /dev/null and b/multisrc/overrides/madara/cizgiromanarsivi/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/cizgiromanarsivi/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/cizgiromanarsivi/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..c18584f20 Binary files /dev/null and b/multisrc/overrides/madara/cizgiromanarsivi/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/cizgiromanarsivi/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/cizgiromanarsivi/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..88f26380d Binary files /dev/null and b/multisrc/overrides/madara/cizgiromanarsivi/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/cizgiromanarsivi/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/cizgiromanarsivi/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..d598af880 Binary files /dev/null and b/multisrc/overrides/madara/cizgiromanarsivi/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/clovermanga/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/clovermanga/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..5f8c7ed1f Binary files /dev/null and b/multisrc/overrides/madara/clovermanga/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/clovermanga/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/clovermanga/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..421a9aba8 Binary files /dev/null and b/multisrc/overrides/madara/clovermanga/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/clovermanga/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/clovermanga/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..3e875f20a Binary files /dev/null and b/multisrc/overrides/madara/clovermanga/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/clovermanga/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/clovermanga/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..3a48d001c Binary files /dev/null and b/multisrc/overrides/madara/clovermanga/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/clovermanga/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/clovermanga/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..30ac89fcb Binary files /dev/null and b/multisrc/overrides/madara/clovermanga/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/clovermanga/src/CloverManga.kt b/multisrc/overrides/madara/clovermanga/src/CloverManga.kt new file mode 100644 index 000000000..f71792297 --- /dev/null +++ b/multisrc/overrides/madara/clovermanga/src/CloverManga.kt @@ -0,0 +1,7 @@ +package eu.kanade.tachiyomi.extension.tr.clovermanga + +import eu.kanade.tachiyomi.multisrc.madara.Madara +import java.text.SimpleDateFormat +import java.util.Locale + +class CloverManga : Madara("Clover Manga", "https://clover-manga.com", "tr", SimpleDateFormat("MMMM dd, yyyy", Locale("tr"))) 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 000000000..c5077ea89 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 000000000..f3fb3ab36 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 000000000..36e003492 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 000000000..02bb580dc 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 000000000..3a8a486e6 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/src/CocoRip.kt b/multisrc/overrides/madara/cocorip/src/CocoRip.kt new file mode 100644 index 000000000..d9f79856c --- /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/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/coffeemanga/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..bd683c987 Binary files /dev/null and b/multisrc/overrides/madara/coffeemanga/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/coffeemanga/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/coffeemanga/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..05f520fc8 Binary files /dev/null and b/multisrc/overrides/madara/coffeemanga/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/coffeemanga/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/coffeemanga/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..956b5d386 Binary files /dev/null and b/multisrc/overrides/madara/coffeemanga/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/coffeemanga/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/coffeemanga/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..ec90f66f2 Binary files /dev/null and b/multisrc/overrides/madara/coffeemanga/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/coffeemanga/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/coffeemanga/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..4ccdee002 Binary files /dev/null and b/multisrc/overrides/madara/coffeemanga/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/coffeemanga/src/CoffeeManga.kt b/multisrc/overrides/madara/coffeemanga/src/CoffeeManga.kt new file mode 100644 index 000000000..dd652e198 --- /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/src/CoffeeMangaTop.kt b/multisrc/overrides/madara/coffeemangatop/src/CoffeeMangaTop.kt new file mode 100644 index 000000000..76b8b2ae0 --- /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/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/coloredmanga/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..32176d3ea Binary files /dev/null and b/multisrc/overrides/madara/coloredmanga/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/coloredmanga/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/coloredmanga/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..1e435c00e Binary files /dev/null and b/multisrc/overrides/madara/coloredmanga/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/coloredmanga/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/coloredmanga/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..75a0bf992 Binary files /dev/null and b/multisrc/overrides/madara/coloredmanga/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/coloredmanga/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/coloredmanga/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..7ee9681af Binary files /dev/null and b/multisrc/overrides/madara/coloredmanga/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/coloredmanga/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/coloredmanga/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..21c8f2ce8 Binary files /dev/null and b/multisrc/overrides/madara/coloredmanga/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/coloredmanga/src/ColoredManga.kt b/multisrc/overrides/madara/coloredmanga/src/ColoredManga.kt new file mode 100644 index 000000000..be16c5d06 --- /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 000000000..e9f3b50c3 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 000000000..cf530cf62 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 000000000..b8be692b5 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 000000000..3bca922d9 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 000000000..2382dc7e9 Binary files /dev/null and b/multisrc/overrides/madara/comicarab/res/mipmap-xxxhdpi/ic_launcher.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 000000000..6dc77be66 --- /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 000000000..910b11d70 --- /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/comicsvalley/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/comicsvalley/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..783175b3c Binary files /dev/null and b/multisrc/overrides/madara/comicsvalley/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/comicsvalley/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/comicsvalley/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..3df0d0d38 Binary files /dev/null and b/multisrc/overrides/madara/comicsvalley/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/comicsvalley/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/comicsvalley/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..b7b50b6a5 Binary files /dev/null and b/multisrc/overrides/madara/comicsvalley/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/comicsvalley/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/comicsvalley/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..e47229dc8 Binary files /dev/null and b/multisrc/overrides/madara/comicsvalley/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/comicsvalley/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/comicsvalley/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..d11c6302c Binary files /dev/null and b/multisrc/overrides/madara/comicsvalley/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/comicsworld/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/comicsworld/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..a21cc0d9b Binary files /dev/null and b/multisrc/overrides/madara/comicsworld/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/comicsworld/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/comicsworld/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..a936f615d Binary files /dev/null and b/multisrc/overrides/madara/comicsworld/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/comicsworld/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/comicsworld/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..366c98437 Binary files /dev/null and b/multisrc/overrides/madara/comicsworld/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/comicsworld/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/comicsworld/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..0d39703db Binary files /dev/null and b/multisrc/overrides/madara/comicsworld/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/comicsworld/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/comicsworld/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..74365bdfa Binary files /dev/null and b/multisrc/overrides/madara/comicsworld/res/mipmap-xxxhdpi/ic_launcher.png differ 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 000000000..2a512df27 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 000000000..d1b00a285 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 000000000..2647035d8 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 000000000..9d70ba755 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 000000000..687733af3 Binary files /dev/null and b/multisrc/overrides/madara/comicznetv2/res/mipmap-xxxhdpi/ic_launcher.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 000000000..c04d7bf89 --- /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/cookiekiara/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/cookiekiara/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..6f5fdc059 Binary files /dev/null and b/multisrc/overrides/madara/cookiekiara/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/cookiekiara/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/cookiekiara/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..1b5135d2b Binary files /dev/null and b/multisrc/overrides/madara/cookiekiara/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/cookiekiara/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/cookiekiara/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..bd4eb6888 Binary files /dev/null and b/multisrc/overrides/madara/cookiekiara/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/cookiekiara/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/cookiekiara/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..ab0518c48 Binary files /dev/null and b/multisrc/overrides/madara/cookiekiara/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/cookiekiara/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/cookiekiara/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..ddc9ce6a3 Binary files /dev/null and b/multisrc/overrides/madara/cookiekiara/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/cookiekiara/src/CookieKiara.kt b/multisrc/overrides/madara/cookiekiara/src/CookieKiara.kt new file mode 100644 index 000000000..439d907d0 --- /dev/null +++ b/multisrc/overrides/madara/cookiekiara/src/CookieKiara.kt @@ -0,0 +1,11 @@ +package eu.kanade.tachiyomi.extension.en.cookiekiara + +import eu.kanade.tachiyomi.multisrc.madara.Madara +import eu.kanade.tachiyomi.source.model.SChapter +import okhttp3.Response + +class CookieKiara : Madara("Cookie Kiara", "https://18.kiara.cool", "en") { + override fun chapterListParse(response: Response): List { + return super.chapterListParse(response).reversed() + } +} diff --git a/multisrc/overrides/madara/copypastescan/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/copypastescan/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..9cccb6a01 Binary files /dev/null and b/multisrc/overrides/madara/copypastescan/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/copypastescan/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/copypastescan/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..6fb40094d Binary files /dev/null and b/multisrc/overrides/madara/copypastescan/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/copypastescan/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/copypastescan/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..06d1c57e4 Binary files /dev/null and b/multisrc/overrides/madara/copypastescan/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/copypastescan/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/copypastescan/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..0cfdce8d7 Binary files /dev/null and b/multisrc/overrides/madara/copypastescan/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/copypastescan/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/copypastescan/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..2500ba721 Binary files /dev/null and b/multisrc/overrides/madara/copypastescan/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/creepyscans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/creepyscans/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..1056a4758 Binary files /dev/null and b/multisrc/overrides/madara/creepyscans/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/creepyscans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/creepyscans/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..642ee2cc6 Binary files /dev/null and b/multisrc/overrides/madara/creepyscans/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/creepyscans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/creepyscans/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..58f471536 Binary files /dev/null and b/multisrc/overrides/madara/creepyscans/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/creepyscans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/creepyscans/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..ea2244a3f Binary files /dev/null and b/multisrc/overrides/madara/creepyscans/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/creepyscans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/creepyscans/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..2d8848d81 Binary files /dev/null and b/multisrc/overrides/madara/creepyscans/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/creepyscans/src/CreepyScans.kt b/multisrc/overrides/madara/creepyscans/src/CreepyScans.kt new file mode 100644 index 000000000..b5359f463 --- /dev/null +++ b/multisrc/overrides/madara/creepyscans/src/CreepyScans.kt @@ -0,0 +1,136 @@ +package eu.kanade.tachiyomi.extension.en.creepyscans + +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 eu.kanade.tachiyomi.source.model.SChapter +import okhttp3.CacheControl +import okhttp3.HttpUrl.Companion.toHttpUrl +import okhttp3.OkHttpClient +import okhttp3.Request +import org.jsoup.nodes.Document +import java.util.concurrent.TimeUnit + +class CreepyScans : Madara( + "CreepyScans", + "https://creepyscans.com", + "en", +) { + + override val client: OkHttpClient = super.client.newBuilder() + .rateLimit(1, 3, TimeUnit.SECONDS) + .build() + + override val useNewChapterEndpoint = true + + // Popular + + override fun popularMangaRequest(page: Int): Request { + return GET( + url = "$baseUrl/$mangaSubString/?m_orderby=views", + headers = headers, + cache = CacheControl.FORCE_NETWORK, + ) + } + + // Latest + + override fun latestUpdatesRequest(page: Int): Request { + return GET( + url = "$baseUrl/$mangaSubString/?m_orderby=latest", + headers = headers, + cache = CacheControl.FORCE_NETWORK, + ) + } + + // Search + + override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { + if (query.isNotBlank()) throw Exception("Search not available") + + val url = "$baseUrl/$mangaSubString/".toHttpUrl().newBuilder() + filters.forEach { filter -> + when (filter) { + is OrderByFilter -> { + if (filter.state != 0) { + url.addQueryParameter("m_orderby", filter.toUriPart()) + } + } + is GenreFilter -> { + val selected = filter.vals[filter.state].second + if (selected.isNotBlank()) { + url.removePathSegment(0) + url.addPathSegment("manga-genre") + url.addPathSegment(filter.vals[filter.state].second) + } + } + else -> {} + } + } + return GET(url.build(), headers) + } + + override fun searchMangaSelector(): String = + super.searchMangaSelector() + ",div.page-content-listing div.page-item-detail" + + override fun searchMangaNextPageSelector(): String? = null + + // Filter + + override fun genresRequest(): Request { + return GET("$baseUrl/$mangaSubString/?genres=", headers) + } + + override fun parseGenres(document: Document): List { + genresList = document.select(".list-unstyled li").mapNotNull { genre -> + genre.selectFirst("a[href]")?.let { + val slug = it.attr("href") + .split("/") + .last(String::isNotEmpty) + + Pair(it.ownText().trim(), slug) + } + } + + return emptyList() + } + + // From manga18fx + private var genresList: List> = emptyList() + + class GenreFilter(val vals: List>) : + Filter.Select("Genre", vals.map { it.first }.toTypedArray()) + + override fun getFilterList(): FilterList { + val filters = buildList(4) { + add( + OrderByFilter( + title = orderByFilterTitle, + options = orderByFilterOptions.zip(orderByFilterOptionsValues), + state = 0, + ), + ) + add(Filter.Separator()) + add(Filter.Header("Filters are ignored for text search!")) + + if (genresList.isNotEmpty()) { + add(GenreFilter(listOf(Pair("", ""), + Pair("Action", "action"), + Pair("Adult", "adult"), + Pair("Adventure", "adventure"), + Pair("Comedy", "comedy"), + Pair("Cooking", "cooking"), + Pair("Detective", "detective"), + Pair("Doujinshi", "doujinshi"), + Pair("Drama", "drama"), + Pair("Ecchi", "ecchi"), + Pair("Fantasy", "fantasy"), + Pair("Gender Bender", "gender-bender"), + Pair("Harem", "harem"), + Pair("Historical", "historical"), + Pair("Horror", "horror"), + Pair("Isekai", "isekai"), + Pair("Josei", "josei"), + Pair("Manga", "manga"), + Pair("Manhua", "manhua"), + Pair("Manhwa", "manhwa"), + Pair("Martial Arts", "martial-arts"), + Pair("Mature", "mature"), + Pair("Mecha", "mecha"), + Pair("Mystery", "mystery"), + Pair("One shot", "one-shot"), + Pair("Psychological", "psychological"), + Pair("Romance", "romance"), + Pair("School Life", "school-life"), + Pair("Sci-fi", "sci-fi"), + Pair("Seinen", "seinen"), + Pair("Shoujo", "shoujo"), + Pair("Shoujo Ai", "shoujo-ai"), + Pair("Shounen", "shounen"), + Pair("Shounen Ai", "shounen-ai"), + Pair("Slice of Life", "slice-of-life"), + Pair("Smut", "smut"), + Pair("Sports", "sports"), + Pair("Supernatural", "supernatural"), + Pair("Tragedy", "tragedy"), + Pair("Webtoon", "webtoon"), + Pair("Yaoi", "yaoi"), + Pair("Yuri", "yuri"), + ), + ) + + override fun getFilterList(): FilterList = FilterList( + Filter.Header("NOTE: Ignored if using text search!"), + Filter.Separator(), + GenreFilter(), + OrderFilter(), + ) + + // Details + + override val mangaDetailsSelectorStatus = ".post-content_item:contains(status) .summary-content" + + override val mangaDetailsSelectorAuthor = ".post-content_item:contains(Author) .summary-content" +} diff --git a/multisrc/overrides/madara/manhwuafans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/manhwuafans/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..12d5c8519 Binary files /dev/null and b/multisrc/overrides/madara/manhwuafans/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/manhwuafans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/manhwuafans/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..28cd2961a Binary files /dev/null and b/multisrc/overrides/madara/manhwuafans/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/manhwuafans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/manhwuafans/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..67eb49634 Binary files /dev/null and b/multisrc/overrides/madara/manhwuafans/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/manhwuafans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/manhwuafans/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..8ebac665e Binary files /dev/null and b/multisrc/overrides/madara/manhwuafans/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/manhwuafans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/manhwuafans/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..289f265c6 Binary files /dev/null and b/multisrc/overrides/madara/manhwuafans/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/manhwuafans/src/Manhwuafans.kt b/multisrc/overrides/madara/manhwuafans/src/Manhwuafans.kt new file mode 100644 index 000000000..17a2fcc49 --- /dev/null +++ b/multisrc/overrides/madara/manhwuafans/src/Manhwuafans.kt @@ -0,0 +1,7 @@ +package eu.kanade.tachiyomi.extension.en.manhwuafans + +import eu.kanade.tachiyomi.multisrc.madara.Madara +import java.text.SimpleDateFormat +import java.util.Locale + +class Manhwuafans : Madara("Manhwua.fans", "https://manhwua.fans", "en", dateFormat = SimpleDateFormat("yyyy'年'M'月'd", Locale.US)) 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 000000000..d2aa736cb 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 000000000..158cc3130 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 000000000..67dc81edd 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 000000000..0e76feae7 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 000000000..a91ea2d3a Binary files /dev/null and b/multisrc/overrides/madara/mantrazscan/res/mipmap-xxxhdpi/ic_launcher.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 000000000..6b1ed6b14 --- /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/manycomic/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/manycomic/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..8286b9e98 Binary files /dev/null and b/multisrc/overrides/madara/manycomic/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/manycomic/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/manycomic/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..1ea6c8bcb Binary files /dev/null and b/multisrc/overrides/madara/manycomic/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/manycomic/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/manycomic/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..8f5ff9f57 Binary files /dev/null and b/multisrc/overrides/madara/manycomic/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/manycomic/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/manycomic/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..1a819aa0a Binary files /dev/null and b/multisrc/overrides/madara/manycomic/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/manycomic/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/manycomic/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..702d74d73 Binary files /dev/null and b/multisrc/overrides/madara/manycomic/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/manytoon/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/manytoon/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..c4e05a730 Binary files /dev/null and b/multisrc/overrides/madara/manytoon/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/manytoon/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/manytoon/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..2acf3ebc2 Binary files /dev/null and b/multisrc/overrides/madara/manytoon/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/manytoon/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/manytoon/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..76740ec27 Binary files /dev/null and b/multisrc/overrides/madara/manytoon/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/manytoon/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/manytoon/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..3da05d855 Binary files /dev/null and b/multisrc/overrides/madara/manytoon/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/manytoon/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/manytoon/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..5584f32cc Binary files /dev/null and b/multisrc/overrides/madara/manytoon/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/manytoon/src/ManyToon.kt b/multisrc/overrides/madara/manytoon/src/ManyToon.kt new file mode 100644 index 000000000..a8d59be80 --- /dev/null +++ b/multisrc/overrides/madara/manytoon/src/ManyToon.kt @@ -0,0 +1,10 @@ +package eu.kanade.tachiyomi.extension.en.manytoon + +import eu.kanade.tachiyomi.multisrc.madara.Madara + +class ManyToon : Madara("ManyToon", "https://manytoon.com", "en") { + + override val mangaSubString = "comic" + + override val useNewChapterEndpoint: Boolean = true +} diff --git a/multisrc/overrides/madara/manytoonclub/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/manytoonclub/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..9d3a48f5d Binary files /dev/null and b/multisrc/overrides/madara/manytoonclub/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/manytoonclub/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/manytoonclub/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..e9b3e19f1 Binary files /dev/null and b/multisrc/overrides/madara/manytoonclub/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/manytoonclub/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/manytoonclub/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..86676d5ef Binary files /dev/null and b/multisrc/overrides/madara/manytoonclub/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/manytoonclub/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/manytoonclub/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..f2ecce959 Binary files /dev/null and b/multisrc/overrides/madara/manytoonclub/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/manytoonclub/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/manytoonclub/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..131b8bdff Binary files /dev/null and b/multisrc/overrides/madara/manytoonclub/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/manytoonclub/src/ManyToonClub.kt b/multisrc/overrides/madara/manytoonclub/src/ManyToonClub.kt new file mode 100644 index 000000000..db227c532 --- /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/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/manytoonme/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..15e36820d Binary files /dev/null and b/multisrc/overrides/madara/manytoonme/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/manytoonme/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/manytoonme/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..d159f66f9 Binary files /dev/null and b/multisrc/overrides/madara/manytoonme/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/manytoonme/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/manytoonme/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..98fc2d92f Binary files /dev/null and b/multisrc/overrides/madara/manytoonme/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/manytoonme/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/manytoonme/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..de79304e1 Binary files /dev/null and b/multisrc/overrides/madara/manytoonme/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/manytoonme/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/manytoonme/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..e3022572b Binary files /dev/null and b/multisrc/overrides/madara/manytoonme/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/manytoonme/src/ManyToonMe.kt b/multisrc/overrides/madara/manytoonme/src/ManyToonMe.kt new file mode 100644 index 000000000..b4446e55e --- /dev/null +++ b/multisrc/overrides/madara/manytoonme/src/ManyToonMe.kt @@ -0,0 +1,10 @@ +package eu.kanade.tachiyomi.extension.en.manytoonme + +import eu.kanade.tachiyomi.multisrc.madara.Madara + +class ManyToonMe : Madara("ManyToon.me", "https://manytoon.me", "en") { + + override val mangaSubString = "comic" + + override val useNewChapterEndpoint: Boolean = true +} diff --git a/multisrc/overrides/madara/mgkomik/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/mgkomik/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..997676f68 Binary files /dev/null and b/multisrc/overrides/madara/mgkomik/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/mgkomik/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/mgkomik/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..45d0d911e Binary files /dev/null and b/multisrc/overrides/madara/mgkomik/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/mgkomik/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/mgkomik/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..361a0b271 Binary files /dev/null and b/multisrc/overrides/madara/mgkomik/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/mgkomik/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/mgkomik/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..820ec86f2 Binary files /dev/null and b/multisrc/overrides/madara/mgkomik/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/mgkomik/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/mgkomik/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..fc54df04c Binary files /dev/null and b/multisrc/overrides/madara/mgkomik/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/mgkomik/src/MGKomik.kt b/multisrc/overrides/madara/mgkomik/src/MGKomik.kt new file mode 100644 index 000000000..30febe8ad --- /dev/null +++ b/multisrc/overrides/madara/mgkomik/src/MGKomik.kt @@ -0,0 +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.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 mangaSubString = "komik" + + override fun searchMangaNextPageSelector() = "a.page.larger" + + override val chapterUrlSuffix = "" +} diff --git a/multisrc/overrides/madara/midnightmanga/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/midnightmanga/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..cf16d8450 Binary files /dev/null and b/multisrc/overrides/madara/midnightmanga/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/midnightmanga/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/midnightmanga/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..c215303c8 Binary files /dev/null and b/multisrc/overrides/madara/midnightmanga/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/midnightmanga/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/midnightmanga/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..9b085e5cb Binary files /dev/null and b/multisrc/overrides/madara/midnightmanga/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/midnightmanga/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/midnightmanga/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..ba1cd190f Binary files /dev/null and b/multisrc/overrides/madara/midnightmanga/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/midnightmanga/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/midnightmanga/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..02f7b226a Binary files /dev/null and b/multisrc/overrides/madara/midnightmanga/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/midnightmanga/src/MidnightManga.kt b/multisrc/overrides/madara/midnightmanga/src/MidnightManga.kt new file mode 100644 index 000000000..ba551c64f --- /dev/null +++ b/multisrc/overrides/madara/midnightmanga/src/MidnightManga.kt @@ -0,0 +1,7 @@ +package eu.kanade.tachiyomi.extension.es.midnightmanga + +import eu.kanade.tachiyomi.multisrc.madara.Madara +import java.text.SimpleDateFormat +import java.util.Locale + +class MidnightManga : Madara("MidnightManga", "http://midnightmanga.com", "es", dateFormat = SimpleDateFormat("dd MMM, yyyy", Locale("es"))) diff --git a/multisrc/overrides/madara/midnightmessscans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/midnightmessscans/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..b7f1a4a15 Binary files /dev/null and b/multisrc/overrides/madara/midnightmessscans/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/midnightmessscans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/midnightmessscans/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..91b0289d2 Binary files /dev/null and b/multisrc/overrides/madara/midnightmessscans/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/midnightmessscans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/midnightmessscans/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..d1b85f9a0 Binary files /dev/null and b/multisrc/overrides/madara/midnightmessscans/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/midnightmessscans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/midnightmessscans/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..53bd006b7 Binary files /dev/null and b/multisrc/overrides/madara/midnightmessscans/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/midnightmessscans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/midnightmessscans/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..cefec1309 Binary files /dev/null and b/multisrc/overrides/madara/midnightmessscans/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/midnightmessscans/src/MidnightMessScans.kt b/multisrc/overrides/madara/midnightmessscans/src/MidnightMessScans.kt new file mode 100644 index 000000000..ed234ca2e --- /dev/null +++ b/multisrc/overrides/madara/midnightmessscans/src/MidnightMessScans.kt @@ -0,0 +1,72 @@ +package eu.kanade.tachiyomi.extension.en.midnightmessscans + +import eu.kanade.tachiyomi.multisrc.madara.Madara +import eu.kanade.tachiyomi.source.model.SManga +import org.jsoup.nodes.Document +import java.util.Locale + +class MidnightMessScans : Madara("Midnight Mess Scans", "https://midnightmess.org", "en") { + + override fun popularMangaSelector() = "div.page-item-detail:not(:has(a[href*='mangadex.org']))" + + override fun mangaDetailsParse(document: Document): SManga { + val manga = SManga.create() + with(document) { + select("div.post-title h3").first()?.let { + manga.title = it.ownText() + } + select("div.author-content").first()?.let { + if (it.text().notUpdating()) manga.author = it.text() + } + select("div.artist-content").first()?.let { + if (it.text().notUpdating()) manga.artist = it.text() + } + select("div.summary_content div.post-content").let { + manga.description = it.select("div.manga-excerpt").text() + } + select("div.summary_image img").first()?.let { + manga.thumbnail_url = imageFromElement(it) + } + select("div.summary-content").last()?.let { + manga.status = when (it.text()) { + // I don't know what's the corresponding for COMPLETED and LICENSED + // There's no support for "Canceled" or "On Hold" + "Completed", "Completo", "Concluído", "Concluido", "Terminé" -> SManga.COMPLETED + "OnGoing", "Продолжается", "Updating", "Em Lançamento", "Em andamento", "Em Andamento", "En cours", "Ativo", "Lançando" -> SManga.ONGOING + else -> SManga.UNKNOWN + } + } + val genres = select("div.genres-content a") + .map { element -> element.text().lowercase(Locale.ROOT) } + .toMutableSet() + + // add tag(s) to genre + select("div.tags-content a").forEach { element -> + if (genres.contains(element.text()).not()) { + genres.add(element.text().lowercase(Locale.ROOT)) + } + } + + // 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(", ") { it.capitalize(Locale.ROOT) } + + // 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/milftoon/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/milftoon/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..7bcb05298 Binary files /dev/null and b/multisrc/overrides/madara/milftoon/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/milftoon/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/milftoon/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..9571f46d7 Binary files /dev/null and b/multisrc/overrides/madara/milftoon/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/milftoon/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/milftoon/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..afc76fbd6 Binary files /dev/null and b/multisrc/overrides/madara/milftoon/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/milftoon/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/milftoon/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..fb64f8463 Binary files /dev/null and b/multisrc/overrides/madara/milftoon/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/milftoon/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/milftoon/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..2f1eef400 Binary files /dev/null and b/multisrc/overrides/madara/milftoon/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/milftoon/src/Milftoon.kt b/multisrc/overrides/madara/milftoon/src/Milftoon.kt new file mode 100644 index 000000000..8c9aee4a0 --- /dev/null +++ b/multisrc/overrides/madara/milftoon/src/Milftoon.kt @@ -0,0 +1,10 @@ +package eu.kanade.tachiyomi.extension.en.milftoon + +import eu.kanade.tachiyomi.multisrc.madara.Madara +import eu.kanade.tachiyomi.network.GET +import okhttp3.Request + +class Milftoon : Madara("Milftoon", "https://milftoon.xxx", "en") { + override fun popularMangaRequest(page: Int): Request = GET("$baseUrl/page/$page/?m_orderby=views", headers) + override fun latestUpdatesRequest(page: Int): Request = GET("$baseUrl/page/$page/?m_orderby=latest", headers) +} diff --git a/multisrc/overrides/madara/minitwoscan/src/MiniTwoScan.kt b/multisrc/overrides/madara/minitwoscan/src/MiniTwoScan.kt new file mode 100644 index 000000000..cffb7c641 --- /dev/null +++ b/multisrc/overrides/madara/minitwoscan/src/MiniTwoScan.kt @@ -0,0 +1,20 @@ +package eu.kanade.tachiyomi.extension.pt.minitwoscan + +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 MiniTwoScan : Madara( + "MiniTwo Scan", + "https://minitwoscan.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/mmscans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/mmscans/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..75fa215ff Binary files /dev/null and b/multisrc/overrides/madara/mmscans/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/mmscans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/mmscans/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..5e5ba35eb Binary files /dev/null and b/multisrc/overrides/madara/mmscans/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/mmscans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/mmscans/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..00dc473db Binary files /dev/null and b/multisrc/overrides/madara/mmscans/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/mmscans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/mmscans/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..5fee6783e Binary files /dev/null and b/multisrc/overrides/madara/mmscans/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/mmscans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/mmscans/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..520338a5d Binary files /dev/null and b/multisrc/overrides/madara/mmscans/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/mmscans/src/MMScans.kt b/multisrc/overrides/madara/mmscans/src/MMScans.kt new file mode 100644 index 000000000..03252b7a7 --- /dev/null +++ b/multisrc/overrides/madara/mmscans/src/MMScans.kt @@ -0,0 +1,110 @@ +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") { + + // The site customized the listing and does not include a .manga class. + override val filterNonMangaItems = false + + override val popularMangaUrlSelector = "div.item-summary a" + override fun chapterListSelector() = "li.chapter-li" + 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() + + with(element) { + select(popularMangaUrlSelector).first()?.let { + manga.setUrlWithoutDomain(it.attr("abs:href")) + manga.title = it.selectFirst("h3")!!.ownText() + } + + 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.selectFirst(".chapter-title-date p")!!.text() + } + chapter.date_upload = parseChapterDate(select(chapterDateSelector()).firstOrNull()?.text()) + } + + return chapter + } + + override fun searchMangaFromElement(element: Element): SManga { + val manga = SManga.create() + + with(element) { + manga.setUrlWithoutDomain(attr("abs:href")) + select("div.post-title h3").first()?.let { + manga.title = it.ownText() + } + select("img").first()?.let { + manga.thumbnail_url = imageFromElement(it) + } + } + + return manga + } + + override val mangaDetailsSelectorDescription = "div.summary-text p" + override val mangaDetailsSelectorGenre = "div.genres-content" +} diff --git a/multisrc/overrides/madara/momonohanascan/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/momonohanascan/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..fc3808d2f Binary files /dev/null and b/multisrc/overrides/madara/momonohanascan/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/momonohanascan/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/momonohanascan/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..7004f9854 Binary files /dev/null and b/multisrc/overrides/madara/momonohanascan/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/momonohanascan/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/momonohanascan/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..0c6e158fc Binary files /dev/null and b/multisrc/overrides/madara/momonohanascan/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/momonohanascan/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/momonohanascan/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..c564c8471 Binary files /dev/null and b/multisrc/overrides/madara/momonohanascan/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/momonohanascan/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/momonohanascan/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..b744dbaef Binary files /dev/null and b/multisrc/overrides/madara/momonohanascan/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/momonohanascan/src/MomoNoHanaScan.kt b/multisrc/overrides/madara/momonohanascan/src/MomoNoHanaScan.kt new file mode 100644 index 000000000..7fee104be --- /dev/null +++ b/multisrc/overrides/madara/momonohanascan/src/MomoNoHanaScan.kt @@ -0,0 +1,22 @@ +package eu.kanade.tachiyomi.extension.pt.momonohanascan + +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 MomoNoHanaScan : Madara( + "Momo no Hana Scan", + "https://momonohanascan.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/monarcamanga/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/monarcamanga/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..b9e1ed236 Binary files /dev/null and b/multisrc/overrides/madara/monarcamanga/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/monarcamanga/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/monarcamanga/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..40ac215f3 Binary files /dev/null and b/multisrc/overrides/madara/monarcamanga/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/monarcamanga/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/monarcamanga/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..d342df8c7 Binary files /dev/null and b/multisrc/overrides/madara/monarcamanga/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/monarcamanga/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/monarcamanga/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..8b81f4596 Binary files /dev/null and b/multisrc/overrides/madara/monarcamanga/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/monarcamanga/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/monarcamanga/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..55c680750 Binary files /dev/null and b/multisrc/overrides/madara/monarcamanga/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/monarcamanga/src/MonarcaManga.kt b/multisrc/overrides/madara/monarcamanga/src/MonarcaManga.kt new file mode 100644 index 000000000..1b8b69768 --- /dev/null +++ b/multisrc/overrides/madara/monarcamanga/src/MonarcaManga.kt @@ -0,0 +1,14 @@ +package eu.kanade.tachiyomi.extension.es.monarcamanga + +import eu.kanade.tachiyomi.multisrc.madara.Madara +import java.text.SimpleDateFormat +import java.util.Locale + +class MonarcaManga : Madara( + "MonarcaManga", + "https://monarcamanga.com", + "es", + SimpleDateFormat("MMM d, yyy", Locale("es")), +) { + override val useNewChapterEndpoint = true +} diff --git a/multisrc/overrides/madara/moonloversscan/src/MoonLoversScan.kt b/multisrc/overrides/madara/moonloversscan/src/MoonLoversScan.kt new file mode 100644 index 000000000..f18ea3d70 --- /dev/null +++ b/multisrc/overrides/madara/moonloversscan/src/MoonLoversScan.kt @@ -0,0 +1,22 @@ +package eu.kanade.tachiyomi.extension.pt.moonloversscan + +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 MoonLoversScan : Madara( + "MoonLovers Scan", + "https://moonloversscan.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/moonwitchinlove/src/MoonWitchInLove.kt b/multisrc/overrides/madara/moonwitchinlove/src/MoonWitchInLove.kt new file mode 100644 index 000000000..79372cad6 --- /dev/null +++ b/multisrc/overrides/madara/moonwitchinlove/src/MoonWitchInLove.kt @@ -0,0 +1,22 @@ +package eu.kanade.tachiyomi.extension.pt.moonwitchinlove + +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 MoonWitchInLove : Madara( + "Moon Witch In Love", + "https://moonwitchinlovescan.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/mortalsgroove/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/mortalsgroove/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..95aad0591 Binary files /dev/null and b/multisrc/overrides/madara/mortalsgroove/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/mortalsgroove/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/mortalsgroove/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..df1b0f3b5 Binary files /dev/null and b/multisrc/overrides/madara/mortalsgroove/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/mortalsgroove/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/mortalsgroove/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..16de5e671 Binary files /dev/null and b/multisrc/overrides/madara/mortalsgroove/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/mortalsgroove/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/mortalsgroove/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..6f4012da7 Binary files /dev/null and b/multisrc/overrides/madara/mortalsgroove/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/mortalsgroove/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/mortalsgroove/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..16893abe7 Binary files /dev/null and b/multisrc/overrides/madara/mortalsgroove/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/mryaoifansub/src/MrYaoiFansub.kt b/multisrc/overrides/madara/mryaoifansub/src/MrYaoiFansub.kt new file mode 100644 index 000000000..253aba47d --- /dev/null +++ b/multisrc/overrides/madara/mryaoifansub/src/MrYaoiFansub.kt @@ -0,0 +1,39 @@ +package eu.kanade.tachiyomi.extension.pt.mryaoifansub + +import eu.kanade.tachiyomi.multisrc.madara.Madara +import eu.kanade.tachiyomi.network.interceptor.rateLimit +import okhttp3.Interceptor +import okhttp3.OkHttpClient +import okhttp3.Response +import java.io.IOException +import java.text.SimpleDateFormat +import java.util.Locale +import java.util.concurrent.TimeUnit + +class MrYaoiFansub : Madara( + "MR Yaoi Fansub", + "https://mrbenne.com", + "pt-BR", + SimpleDateFormat("dd/MM/yyyy", Locale("pt", "BR")), +) { + + override val client: OkHttpClient = super.client.newBuilder() + .addInterceptor(::loginCheckIntercept) + .rateLimit(1, 2, TimeUnit.SECONDS) + .build() + + private fun loginCheckIntercept(chain: Interceptor.Chain): Response { + val response = chain.proceed(chain.request()) + + if (response.request.url.queryParameter("password-protected").isNullOrEmpty()) { + return response + } + + response.close() + throw IOException(LOGIN_THROUGH_WEBVIEW_ERROR) + } + + companion object { + private const val LOGIN_THROUGH_WEBVIEW_ERROR = "Autentique-se pela WebView para usar a extensão." + } +} diff --git a/multisrc/overrides/madara/muctau/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/muctau/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..ccea04a50 Binary files /dev/null and b/multisrc/overrides/madara/muctau/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/muctau/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/muctau/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..0d42e34fe Binary files /dev/null and b/multisrc/overrides/madara/muctau/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/muctau/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/muctau/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..94df4f2db Binary files /dev/null and b/multisrc/overrides/madara/muctau/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/muctau/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/muctau/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..77ab736e7 Binary files /dev/null and b/multisrc/overrides/madara/muctau/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/muctau/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/muctau/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..37e8dbaee Binary files /dev/null and b/multisrc/overrides/madara/muctau/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/murimscan/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/murimscan/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..7cb383031 Binary files /dev/null and b/multisrc/overrides/madara/murimscan/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/murimscan/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/murimscan/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..de7e69861 Binary files /dev/null and b/multisrc/overrides/madara/murimscan/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/murimscan/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/murimscan/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..5217af00d Binary files /dev/null and b/multisrc/overrides/madara/murimscan/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/murimscan/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/murimscan/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..6daf288e5 Binary files /dev/null and b/multisrc/overrides/madara/murimscan/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/murimscan/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/murimscan/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..f363b2a21 Binary files /dev/null and b/multisrc/overrides/madara/murimscan/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/murimscan/src/MurimScan.kt b/multisrc/overrides/madara/murimscan/src/MurimScan.kt new file mode 100644 index 000000000..d67103f64 --- /dev/null +++ b/multisrc/overrides/madara/murimscan/src/MurimScan.kt @@ -0,0 +1,7 @@ +package eu.kanade.tachiyomi.extension.en.murimscan + +import eu.kanade.tachiyomi.multisrc.madara.Madara + +class MurimScan : Madara("MurimScan", "https://murimscan.run", "en") { + override val useNewChapterEndpoint = false +} diff --git a/multisrc/overrides/madara/mymanhwa/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/mymanhwa/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..2483b5431 Binary files /dev/null and b/multisrc/overrides/madara/mymanhwa/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/mymanhwa/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/mymanhwa/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..efc9bf1c8 Binary files /dev/null and b/multisrc/overrides/madara/mymanhwa/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/mymanhwa/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/mymanhwa/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..920d0043b Binary files /dev/null and b/multisrc/overrides/madara/mymanhwa/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/mymanhwa/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/mymanhwa/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..a8b781ede Binary files /dev/null and b/multisrc/overrides/madara/mymanhwa/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/mymanhwa/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/mymanhwa/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..be1855da2 Binary files /dev/null and b/multisrc/overrides/madara/mymanhwa/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/mysticalmerries/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/mysticalmerries/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..992a68330 Binary files /dev/null and b/multisrc/overrides/madara/mysticalmerries/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/mysticalmerries/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/mysticalmerries/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..a1df64995 Binary files /dev/null and b/multisrc/overrides/madara/mysticalmerries/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/mysticalmerries/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/mysticalmerries/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..6c4676e24 Binary files /dev/null and b/multisrc/overrides/madara/mysticalmerries/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/mysticalmerries/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/mysticalmerries/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..774c3eba4 Binary files /dev/null and b/multisrc/overrides/madara/mysticalmerries/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/mysticalmerries/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/mysticalmerries/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..804fc7b19 Binary files /dev/null and b/multisrc/overrides/madara/mysticalmerries/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/mysticalmerries/src/MysticalMerries.kt b/multisrc/overrides/madara/mysticalmerries/src/MysticalMerries.kt new file mode 100644 index 000000000..b7ae058dc --- /dev/null +++ b/multisrc/overrides/madara/mysticalmerries/src/MysticalMerries.kt @@ -0,0 +1,11 @@ +package eu.kanade.tachiyomi.extension.en.mysticalmerries + +import eu.kanade.tachiyomi.multisrc.madara.Madara +import eu.kanade.tachiyomi.network.GET + +class MysticalMerries : Madara("Mystical Merries", "https://mysticalmerries.com", "en") { + override fun popularMangaRequest(page: Int) = GET("$baseUrl/genre/manhwa/page/$page/?m_orderby=trending", headers) + override fun latestUpdatesRequest(page: Int) = GET("$baseUrl/genre/manhwa/page/$page/?m_orderby=latest", headers) + override fun popularMangaNextPageSelector(): String? = "div.nav-previous" + override fun latestUpdatesNextPageSelector(): String? = popularMangaNextPageSelector() +} diff --git a/multisrc/overrides/madara/neatmanga/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/neatmanga/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..07ea71a4f Binary files /dev/null and b/multisrc/overrides/madara/neatmanga/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/neatmanga/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/neatmanga/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..bc042e56d Binary files /dev/null and b/multisrc/overrides/madara/neatmanga/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/neatmanga/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/neatmanga/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..e62d67847 Binary files /dev/null and b/multisrc/overrides/madara/neatmanga/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/neatmanga/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/neatmanga/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..9566fc5e3 Binary files /dev/null and b/multisrc/overrides/madara/neatmanga/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/neatmanga/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/neatmanga/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..f503a85da Binary files /dev/null and b/multisrc/overrides/madara/neatmanga/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/neatmanga/src/NeatManga.kt b/multisrc/overrides/madara/neatmanga/src/NeatManga.kt new file mode 100644 index 000000000..9ef39a44b --- /dev/null +++ b/multisrc/overrides/madara/neatmanga/src/NeatManga.kt @@ -0,0 +1,9 @@ +package eu.kanade.tachiyomi.extension.en.neatmanga + +import eu.kanade.tachiyomi.multisrc.madara.Madara +import java.text.SimpleDateFormat +import java.util.Locale + +class NeatManga : Madara("NeatManga", "https://neatmanga.com", "en", SimpleDateFormat("dd MMM yyyy", Locale.US)) { + override val useNewChapterEndpoint = true +} 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 000000000..9a3861d3e 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 000000000..d6f802b83 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 000000000..4a678c8e4 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 000000000..a2ef8a645 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 000000000..90feb1ac2 Binary files /dev/null and b/multisrc/overrides/madara/nekopostco/res/mipmap-xxxhdpi/ic_launcher.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 000000000..e6f41d554 --- /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/nekoscan/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/nekoscan/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..7b7a106bb Binary files /dev/null and b/multisrc/overrides/madara/nekoscan/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/nekoscan/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/nekoscan/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..0de62c2b4 Binary files /dev/null and b/multisrc/overrides/madara/nekoscan/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/nekoscan/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/nekoscan/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..ae3604a18 Binary files /dev/null and b/multisrc/overrides/madara/nekoscan/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/nekoscan/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/nekoscan/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..fbf232c65 Binary files /dev/null and b/multisrc/overrides/madara/nekoscan/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/nekoscan/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/nekoscan/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..891973078 Binary files /dev/null and b/multisrc/overrides/madara/nekoscan/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/newmanhua/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/newmanhua/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..03b8c0cde Binary files /dev/null and b/multisrc/overrides/madara/newmanhua/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/newmanhua/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/newmanhua/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..dc32f6070 Binary files /dev/null and b/multisrc/overrides/madara/newmanhua/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/newmanhua/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/newmanhua/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..8aa474ee9 Binary files /dev/null and b/multisrc/overrides/madara/newmanhua/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/newmanhua/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/newmanhua/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..2e6e5b97d Binary files /dev/null and b/multisrc/overrides/madara/newmanhua/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/newmanhua/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/newmanhua/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..6f641fe79 Binary files /dev/null and b/multisrc/overrides/madara/newmanhua/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/newmanhua/src/NewManhua.kt b/multisrc/overrides/madara/newmanhua/src/NewManhua.kt new file mode 100644 index 000000000..5d8221662 --- /dev/null +++ b/multisrc/overrides/madara/newmanhua/src/NewManhua.kt @@ -0,0 +1,21 @@ +package eu.kanade.tachiyomi.extension.en.newmanhua + +import eu.kanade.tachiyomi.multisrc.madara.Madara +import eu.kanade.tachiyomi.network.interceptor.rateLimit +import okhttp3.OkHttpClient + +class NewManhua : Madara( + "NewManhua", + "https://newmanhua.com", + "en", +) { + + override val client: OkHttpClient = super.client.newBuilder() + .rateLimit(1) + .build() + + override val useNewChapterEndpoint = true + + override val mangaDetailsSelectorDescription: String = + "div.description-summary div.summary__content h3 + p, div.description-summary div.summary__content:not(:has(h3)), div.summary_content div.post-content_item > h5 + div, div.summary_content div.manga-excerpt" +} diff --git a/multisrc/overrides/madara/nightcomic/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/nightcomic/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..0cc90b7ba Binary files /dev/null and b/multisrc/overrides/madara/nightcomic/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/nightcomic/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/nightcomic/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..b11ddcb29 Binary files /dev/null and b/multisrc/overrides/madara/nightcomic/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/nightcomic/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/nightcomic/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..bb1564529 Binary files /dev/null and b/multisrc/overrides/madara/nightcomic/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/nightcomic/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/nightcomic/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..03bef40e7 Binary files /dev/null and b/multisrc/overrides/madara/nightcomic/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/nightcomic/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/nightcomic/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..85e39872c Binary files /dev/null and b/multisrc/overrides/madara/nightcomic/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/nijitranslations/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/nijitranslations/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..de4a99abe Binary files /dev/null and b/multisrc/overrides/madara/nijitranslations/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/nijitranslations/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/nijitranslations/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..a76571805 Binary files /dev/null and b/multisrc/overrides/madara/nijitranslations/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/nijitranslations/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/nijitranslations/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..501e48e03 Binary files /dev/null and b/multisrc/overrides/madara/nijitranslations/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/nijitranslations/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/nijitranslations/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..871f36c7f Binary files /dev/null and b/multisrc/overrides/madara/nijitranslations/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/nijitranslations/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/nijitranslations/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..e561809b0 Binary files /dev/null and b/multisrc/overrides/madara/nijitranslations/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/nijitranslations/src/NijiTranslations.kt b/multisrc/overrides/madara/nijitranslations/src/NijiTranslations.kt new file mode 100644 index 000000000..bec40b814 --- /dev/null +++ b/multisrc/overrides/madara/nijitranslations/src/NijiTranslations.kt @@ -0,0 +1,7 @@ +package eu.kanade.tachiyomi.extension.ar.nijitranslations + +import eu.kanade.tachiyomi.multisrc.madara.Madara +import java.text.SimpleDateFormat +import java.util.Locale + +class NijiTranslations : Madara("Niji Translations", "https://niji-translations.com", "ar", SimpleDateFormat("MMMM dd, yyyy", Locale("ar"))) diff --git a/multisrc/overrides/madara/nitroscans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/nitroscans/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..cbc945267 Binary files /dev/null and b/multisrc/overrides/madara/nitroscans/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/nitroscans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/nitroscans/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..14cb47b45 Binary files /dev/null and b/multisrc/overrides/madara/nitroscans/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/nitroscans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/nitroscans/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..30eb0ad36 Binary files /dev/null and b/multisrc/overrides/madara/nitroscans/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/nitroscans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/nitroscans/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..e07318d4f Binary files /dev/null and b/multisrc/overrides/madara/nitroscans/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/nitroscans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/nitroscans/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..d132110f5 Binary files /dev/null and b/multisrc/overrides/madara/nitroscans/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/nitroscans/src/NitroScans.kt b/multisrc/overrides/madara/nitroscans/src/NitroScans.kt new file mode 100644 index 000000000..a04aff3ed --- /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/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/noblessetranslations/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..877496206 Binary files /dev/null and b/multisrc/overrides/madara/noblessetranslations/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/noblessetranslations/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/noblessetranslations/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..2552a9863 Binary files /dev/null and b/multisrc/overrides/madara/noblessetranslations/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/noblessetranslations/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/noblessetranslations/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..27198d325 Binary files /dev/null and b/multisrc/overrides/madara/noblessetranslations/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/noblessetranslations/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/noblessetranslations/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..f7bb91e99 Binary files /dev/null and b/multisrc/overrides/madara/noblessetranslations/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/noblessetranslations/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/noblessetranslations/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..0d6ea746b Binary files /dev/null and b/multisrc/overrides/madara/noblessetranslations/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/noblessetranslations/src/NoblesseTranslations.kt b/multisrc/overrides/madara/noblessetranslations/src/NoblesseTranslations.kt new file mode 100644 index 000000000..db09730b7 --- /dev/null +++ b/multisrc/overrides/madara/noblessetranslations/src/NoblesseTranslations.kt @@ -0,0 +1,58 @@ +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.noblessev1.com", + "es", + dateFormat = SimpleDateFormat("MMMM d, yyyy", Locale("es")), +) { + override val useNewChapterEndpoint = true + override val mangaSubString = "manga" + + override fun popularMangaNextPageSelector() = "body:not(:has(.no-posts))" + + override val mangaDetailsSelectorDescription = "div.summary_content > div.post-content div.manga-summary" + 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/nocturnesummer/src/NocturneSummer.kt b/multisrc/overrides/madara/nocturnesummer/src/NocturneSummer.kt new file mode 100644 index 000000000..e5a6d6a72 --- /dev/null +++ b/multisrc/overrides/madara/nocturnesummer/src/NocturneSummer.kt @@ -0,0 +1,22 @@ +package eu.kanade.tachiyomi.extension.pt.nocturnesummer + +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 NocturneSummer : Madara( + "Nocturne Summer", + "https://nocsummer.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/noindexscan/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/noindexscan/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..782dbcd43 Binary files /dev/null and b/multisrc/overrides/madara/noindexscan/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/noindexscan/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/noindexscan/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..9d495bb9c Binary files /dev/null and b/multisrc/overrides/madara/noindexscan/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/noindexscan/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/noindexscan/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..68a827c3d Binary files /dev/null and b/multisrc/overrides/madara/noindexscan/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/noindexscan/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/noindexscan/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..97bdf1b82 Binary files /dev/null and b/multisrc/overrides/madara/noindexscan/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/noindexscan/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/noindexscan/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..0f6a8831e Binary files /dev/null and b/multisrc/overrides/madara/noindexscan/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/noindexscan/src/NoIndexScan.kt b/multisrc/overrides/madara/noindexscan/src/NoIndexScan.kt new file mode 100644 index 000000000..5452b8b89 --- /dev/null +++ b/multisrc/overrides/madara/noindexscan/src/NoIndexScan.kt @@ -0,0 +1,21 @@ +package eu.kanade.tachiyomi.extension.pt.noindexscan + +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 NoIndexScan : Madara( + "No Index Scan", + "https://noindexscan.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/novelcrow/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/novelcrow/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..39428033b Binary files /dev/null and b/multisrc/overrides/madara/novelcrow/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/novelcrow/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/novelcrow/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..0bdd27d57 Binary files /dev/null and b/multisrc/overrides/madara/novelcrow/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/novelcrow/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/novelcrow/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..ca80fd9db Binary files /dev/null and b/multisrc/overrides/madara/novelcrow/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/novelcrow/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/novelcrow/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..b99ff7203 Binary files /dev/null and b/multisrc/overrides/madara/novelcrow/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/novelcrow/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/novelcrow/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..35470ed3b Binary files /dev/null and b/multisrc/overrides/madara/novelcrow/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/novelcrow/src/NovelCrow.kt b/multisrc/overrides/madara/novelcrow/src/NovelCrow.kt new file mode 100644 index 000000000..2da15590f --- /dev/null +++ b/multisrc/overrides/madara/novelcrow/src/NovelCrow.kt @@ -0,0 +1,7 @@ +package eu.kanade.tachiyomi.extension.en.novelcrow + +import eu.kanade.tachiyomi.multisrc.madara.Madara + +class NovelCrow : Madara("NovelCrow", "https://novelcrow.com", "en") { + override val useNewChapterEndpoint = true +} diff --git a/multisrc/overrides/madara/novelmic/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/novelmic/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..2a3c19deb Binary files /dev/null and b/multisrc/overrides/madara/novelmic/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/novelmic/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/novelmic/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..e456c1ac7 Binary files /dev/null and b/multisrc/overrides/madara/novelmic/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/novelmic/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/novelmic/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..23cbe09c9 Binary files /dev/null and b/multisrc/overrides/madara/novelmic/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/novelmic/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/novelmic/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..2f4ffe048 Binary files /dev/null and b/multisrc/overrides/madara/novelmic/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/novelmic/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/novelmic/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..214aadf37 Binary files /dev/null and b/multisrc/overrides/madara/novelmic/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/ohnomanga/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/ohnomanga/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..4db23c669 Binary files /dev/null and b/multisrc/overrides/madara/ohnomanga/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/ohnomanga/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/ohnomanga/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..63e520075 Binary files /dev/null and b/multisrc/overrides/madara/ohnomanga/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/ohnomanga/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/ohnomanga/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..37f8af9f7 Binary files /dev/null and b/multisrc/overrides/madara/ohnomanga/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/ohnomanga/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/ohnomanga/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..5b7c48e1e Binary files /dev/null and b/multisrc/overrides/madara/ohnomanga/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/ohnomanga/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/ohnomanga/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..55e7635f7 Binary files /dev/null and b/multisrc/overrides/madara/ohnomanga/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/onlymanhwa/src/OnlyManhwa.kt b/multisrc/overrides/madara/onlymanhwa/src/OnlyManhwa.kt new file mode 100644 index 000000000..5013f8987 --- /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/pantheonscan/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/pantheonscan/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..9a7cba0e5 Binary files /dev/null and b/multisrc/overrides/madara/pantheonscan/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/pantheonscan/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/pantheonscan/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..b8d4e0f1b Binary files /dev/null and b/multisrc/overrides/madara/pantheonscan/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/pantheonscan/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/pantheonscan/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..46abdeaee Binary files /dev/null and b/multisrc/overrides/madara/pantheonscan/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/pantheonscan/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/pantheonscan/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..dc6b26f08 Binary files /dev/null and b/multisrc/overrides/madara/pantheonscan/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/pantheonscan/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/pantheonscan/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..325e918ef Binary files /dev/null and b/multisrc/overrides/madara/pantheonscan/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/pantheonscan/src/PantheonScan.kt b/multisrc/overrides/madara/pantheonscan/src/PantheonScan.kt new file mode 100644 index 000000000..da7ac93fd --- /dev/null +++ b/multisrc/overrides/madara/pantheonscan/src/PantheonScan.kt @@ -0,0 +1,9 @@ +package eu.kanade.tachiyomi.extension.fr.pantheonscan + +import eu.kanade.tachiyomi.multisrc.madara.Madara +import java.text.SimpleDateFormat +import java.util.Locale + +class PantheonScan : Madara("Pantheon Scan", "https://pantheon-scan.com", "fr", dateFormat = SimpleDateFormat("d MMMM yyyy", Locale.FRANCE)) { + override val useNewChapterEndpoint = true +} 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 000000000..0cc5a3e4f 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 000000000..f5efd36d3 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 000000000..2c91a0d84 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 000000000..b0ae9e84b 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 000000000..30241a3c7 Binary files /dev/null and b/multisrc/overrides/madara/paragonscans/res/mipmap-xxxhdpi/ic_launcher.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 000000000..ef4d7ba70 --- /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 000000000..7eb437fb9 --- /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 000000000..0e5b55b8b 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 000000000..8d78e85b8 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 000000000..8442eba82 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 000000000..4b5b3cb52 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 000000000..fa47aeac2 Binary files /dev/null and b/multisrc/overrides/madara/pawmanga/res/mipmap-xxxhdpi/ic_launcher.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 000000000..f82a6f971 --- /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/petrotechsociety/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/petrotechsociety/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..f61aa312e Binary files /dev/null and b/multisrc/overrides/madara/petrotechsociety/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/petrotechsociety/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/petrotechsociety/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..12006917e Binary files /dev/null and b/multisrc/overrides/madara/petrotechsociety/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/petrotechsociety/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/petrotechsociety/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..4136044ca Binary files /dev/null and b/multisrc/overrides/madara/petrotechsociety/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/petrotechsociety/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/petrotechsociety/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..3b015daba Binary files /dev/null and b/multisrc/overrides/madara/petrotechsociety/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/petrotechsociety/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/petrotechsociety/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..828d5c241 Binary files /dev/null and b/multisrc/overrides/madara/petrotechsociety/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/pianmanga/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/pianmanga/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..c7199d2dd Binary files /dev/null and b/multisrc/overrides/madara/pianmanga/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/pianmanga/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/pianmanga/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..526267fe2 Binary files /dev/null and b/multisrc/overrides/madara/pianmanga/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/pianmanga/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/pianmanga/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..71d44781b Binary files /dev/null and b/multisrc/overrides/madara/pianmanga/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/pianmanga/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/pianmanga/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..3983981c2 Binary files /dev/null and b/multisrc/overrides/madara/pianmanga/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/pianmanga/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/pianmanga/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..b00b5300a Binary files /dev/null and b/multisrc/overrides/madara/pianmanga/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/pikiranwibu/PikiranWibu.kt b/multisrc/overrides/madara/pikiranwibu/PikiranWibu.kt new file mode 100644 index 000000000..11119216c --- /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/pinkseaunicorn/src/PinkSeaUnicorn.kt b/multisrc/overrides/madara/pinkseaunicorn/src/PinkSeaUnicorn.kt new file mode 100644 index 000000000..26dbd7012 --- /dev/null +++ b/multisrc/overrides/madara/pinkseaunicorn/src/PinkSeaUnicorn.kt @@ -0,0 +1,22 @@ +package eu.kanade.tachiyomi.extension.pt.pinkseaunicorn + +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 PinkSeaUnicorn : Madara( + "Pink Sea Unicorn", + "https://psunicorn.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/pirulitorosa/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/pirulitorosa/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..9670f9468 Binary files /dev/null and b/multisrc/overrides/madara/pirulitorosa/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/pirulitorosa/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/pirulitorosa/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..2a8933631 Binary files /dev/null and b/multisrc/overrides/madara/pirulitorosa/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/pirulitorosa/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/pirulitorosa/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..2ece023c8 Binary files /dev/null and b/multisrc/overrides/madara/pirulitorosa/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/pirulitorosa/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/pirulitorosa/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..5264f58d7 Binary files /dev/null and b/multisrc/overrides/madara/pirulitorosa/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/pirulitorosa/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/pirulitorosa/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..52e8dff36 Binary files /dev/null and b/multisrc/overrides/madara/pirulitorosa/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/pirulitorosa/src/PirulitoRosa.kt b/multisrc/overrides/madara/pirulitorosa/src/PirulitoRosa.kt new file mode 100644 index 000000000..5f5570721 --- /dev/null +++ b/multisrc/overrides/madara/pirulitorosa/src/PirulitoRosa.kt @@ -0,0 +1,22 @@ +package eu.kanade.tachiyomi.extension.pt.pirulitorosa + +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 PirulitoRosa : Madara( + "Pirulito Rosa", + "https://pirulitorosa.site", + "pt-BR", + SimpleDateFormat("dd/MM/yyy", Locale("pt", "BR")), +) { + + override val client: OkHttpClient = super.client.newBuilder() + .rateLimit(1, 2, TimeUnit.SECONDS) + .build() + + override val popularMangaUrlSelector = "div.post-title a:last-child" +} diff --git a/multisrc/overrides/madara/platinumcrown/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/platinumcrown/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..4b8570ea9 Binary files /dev/null and b/multisrc/overrides/madara/platinumcrown/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/platinumcrown/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/platinumcrown/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..0dc1f9307 Binary files /dev/null and b/multisrc/overrides/madara/platinumcrown/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/platinumcrown/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/platinumcrown/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..fdf74fd05 Binary files /dev/null and b/multisrc/overrides/madara/platinumcrown/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/platinumcrown/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/platinumcrown/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..0b83c69ce Binary files /dev/null and b/multisrc/overrides/madara/platinumcrown/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/platinumcrown/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/platinumcrown/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..ba454d18d Binary files /dev/null and b/multisrc/overrides/madara/platinumcrown/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/pmscans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/pmscans/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..c76d13239 Binary files /dev/null and b/multisrc/overrides/madara/pmscans/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/pmscans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/pmscans/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..6e4877440 Binary files /dev/null and b/multisrc/overrides/madara/pmscans/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/pmscans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/pmscans/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..60c700e2c Binary files /dev/null and b/multisrc/overrides/madara/pmscans/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/pmscans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/pmscans/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..0cc0ea7d8 Binary files /dev/null and b/multisrc/overrides/madara/pmscans/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/pmscans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/pmscans/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..7803ae882 Binary files /dev/null and b/multisrc/overrides/madara/pmscans/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/pmscans/src/PMScans.kt b/multisrc/overrides/madara/pmscans/src/PMScans.kt new file mode 100644 index 000000000..98969144e --- /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/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/pojokmanga/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..7f0a70826 Binary files /dev/null and b/multisrc/overrides/madara/pojokmanga/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/pojokmanga/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/pojokmanga/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..56d5a240a Binary files /dev/null and b/multisrc/overrides/madara/pojokmanga/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/pojokmanga/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/pojokmanga/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..e7b5ccde2 Binary files /dev/null and b/multisrc/overrides/madara/pojokmanga/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/pojokmanga/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/pojokmanga/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..77f3a22de Binary files /dev/null and b/multisrc/overrides/madara/pojokmanga/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/pojokmanga/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/pojokmanga/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..e282e9a1b Binary files /dev/null and b/multisrc/overrides/madara/pojokmanga/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/pojokmanga/src/PojokManga.kt b/multisrc/overrides/madara/pojokmanga/src/PojokManga.kt new file mode 100644 index 000000000..6cde6c452 --- /dev/null +++ b/multisrc/overrides/madara/pojokmanga/src/PojokManga.kt @@ -0,0 +1,106 @@ +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) + url.addQueryParameter("post_type", "wp-manga") + filters.forEach { filter -> + when (filter) { + is AuthorFilter -> { + if (filter.state.isNotBlank()) { + url.addQueryParameter("author", filter.state) + } + } + is ArtistFilter -> { + if (filter.state.isNotBlank()) { + url.addQueryParameter("artist", filter.state) + } + } + is YearFilter -> { + if (filter.state.isNotBlank()) { + url.addQueryParameter("release", filter.state) + } + } + is StatusFilter -> { + filter.state.forEach { + if (it.state) { + url.addQueryParameter("status[]", it.id) + } + } + } + is OrderByFilter -> { + if (filter.state != 0) { + url.addQueryParameter("m_orderby", filter.toUriPart()) + } + } + is AdultContentFilter -> { + url.addQueryParameter("adult", filter.toUriPart()) + } + is GenreConditionFilter -> { + url.addQueryParameter("op", filter.toUriPart()) + } + is GenreList -> { + filter.state + .filter { it.state } + .let { list -> + if (list.isNotEmpty()) { list.forEach { genre -> url.addQueryParameter("genre[]", genre.id) } } + } + } + is ProjectFilter -> { + if (filter.toUriPart() == "project-filter-on") { + url = "$baseUrl/project/page/$page".toHttpUrlOrNull()!!.newBuilder() + } + } + else -> {} + } + } + return GET(url.toString(), headers) + } + + override fun searchMangaSelector() = "div.c-tabs-item__content, div.page-item-detail" + + override val mangaDetailsSelectorTag = "#toNotBeUsed" + + protected class ProjectFilter : UriPartFilter( + "Filter Project", + arrayOf( + Pair("Show all manga", ""), + Pair("Show only project manga", "project-filter-on"), + ), + ) + + override fun getFilterList(): FilterList { + val filters = super.getFilterList().toMutableList() + + filters += listOf( + Filter.Separator(), + Filter.Header("NOTE: cant be used with other filter!"), + Filter.Header("$name Project List page"), + ProjectFilter(), + ) + + return FilterList(filters) + } +} diff --git a/multisrc/overrides/madara/pomanga/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/pomanga/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..5c456dc97 Binary files /dev/null and b/multisrc/overrides/madara/pomanga/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/pomanga/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/pomanga/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..1ea365636 Binary files /dev/null and b/multisrc/overrides/madara/pomanga/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/pomanga/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/pomanga/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..2937bc5ee Binary files /dev/null and b/multisrc/overrides/madara/pomanga/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/pomanga/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/pomanga/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..ef2c8fe66 Binary files /dev/null and b/multisrc/overrides/madara/pomanga/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/pomanga/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/pomanga/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..1701a2b3f Binary files /dev/null and b/multisrc/overrides/madara/pomanga/res/mipmap-xxxhdpi/ic_launcher.png differ 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 000000000..5e9a38534 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 000000000..f594216ce 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 000000000..204a043d7 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 000000000..9b4a5c706 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 000000000..8fa44a9de Binary files /dev/null and b/multisrc/overrides/madara/ponymanga/res/mipmap-xxxhdpi/ic_launcher.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 000000000..559b8df95 --- /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/porncomix/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/porncomix/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..50a67f8fd Binary files /dev/null and b/multisrc/overrides/madara/porncomix/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/porncomix/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/porncomix/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..ea44ac936 Binary files /dev/null and b/multisrc/overrides/madara/porncomix/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/porncomix/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/porncomix/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..de49518b2 Binary files /dev/null and b/multisrc/overrides/madara/porncomix/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/porncomix/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/porncomix/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..613109030 Binary files /dev/null and b/multisrc/overrides/madara/porncomix/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/porncomix/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/porncomix/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..179792465 Binary files /dev/null and b/multisrc/overrides/madara/porncomix/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/pornhwa18/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/pornhwa18/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..97849869e Binary files /dev/null and b/multisrc/overrides/madara/pornhwa18/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/pornhwa18/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/pornhwa18/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..40fac84c9 Binary files /dev/null and b/multisrc/overrides/madara/pornhwa18/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/pornhwa18/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/pornhwa18/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..3adbd4fc9 Binary files /dev/null and b/multisrc/overrides/madara/pornhwa18/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/pornhwa18/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/pornhwa18/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..cbf166fc9 Binary files /dev/null and b/multisrc/overrides/madara/pornhwa18/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/pornhwa18/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/pornhwa18/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..be329ca5d Binary files /dev/null and b/multisrc/overrides/madara/pornhwa18/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/pornhwa18/src/Pornhwa18.kt b/multisrc/overrides/madara/pornhwa18/src/Pornhwa18.kt new file mode 100644 index 000000000..d0dd13757 --- /dev/null +++ b/multisrc/overrides/madara/pornhwa18/src/Pornhwa18.kt @@ -0,0 +1,11 @@ +package eu.kanade.tachiyomi.extension.id.pornhwa18 + +import eu.kanade.tachiyomi.multisrc.madara.Madara +import eu.kanade.tachiyomi.network.GET +import okhttp3.Request + +class Pornhwa18 : Madara("Pornhwa18", "https://pornhwa18.com", "id") { + override val filterNonMangaItems = false + override fun popularMangaRequest(page: Int): Request = GET("$baseUrl/series/page/$page/?m_orderby=views", headers) + override fun latestUpdatesRequest(page: Int): Request = GET("$baseUrl/series/page/$page/?m_orderby=latest", headers) +} diff --git a/multisrc/overrides/madara/pornwha/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/pornwha/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..1a5c104c1 Binary files /dev/null and b/multisrc/overrides/madara/pornwha/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/pornwha/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/pornwha/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..0f04f48fa Binary files /dev/null and b/multisrc/overrides/madara/pornwha/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/pornwha/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/pornwha/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..fd392a2b5 Binary files /dev/null and b/multisrc/overrides/madara/pornwha/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/pornwha/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/pornwha/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..29a6dd8e9 Binary files /dev/null and b/multisrc/overrides/madara/pornwha/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/pornwha/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/pornwha/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..979797d8f Binary files /dev/null and b/multisrc/overrides/madara/pornwha/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/portalyaoi/src/PortalYaoi.kt b/multisrc/overrides/madara/portalyaoi/src/PortalYaoi.kt new file mode 100644 index 000000000..d3d823300 --- /dev/null +++ b/multisrc/overrides/madara/portalyaoi/src/PortalYaoi.kt @@ -0,0 +1,20 @@ +package eu.kanade.tachiyomi.extension.pt.portalyaoi + +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 PortalYaoi : Madara( + "Portal Yaoi", + "https://portalyaoi.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/prismahentais/src/PrismaHentais.kt b/multisrc/overrides/madara/prismahentais/src/PrismaHentais.kt new file mode 100644 index 000000000..3f7f89a18 --- /dev/null +++ b/multisrc/overrides/madara/prismahentais/src/PrismaHentais.kt @@ -0,0 +1,20 @@ +package eu.kanade.tachiyomi.extension.pt.prismahentais + +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 PrismaHentais : Madara( + "Prisma Hentais", + "https://prismahentai.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/prismascans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/prismascans/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..f2ce0ea2a Binary files /dev/null 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 new file mode 100644 index 000000000..a095dfa38 Binary files /dev/null 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 new file mode 100644 index 000000000..1673491c7 Binary files /dev/null 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 new file mode 100644 index 000000000..dd419c46c Binary files /dev/null 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 new file mode 100644 index 000000000..f77543914 Binary files /dev/null and b/multisrc/overrides/madara/prismascans/res/mipmap-xxxhdpi/ic_launcher.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 000000000..878d1f4a0 --- /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/projetoscanlator/src/ProjetoScanlator.kt b/multisrc/overrides/madara/projetoscanlator/src/ProjetoScanlator.kt new file mode 100644 index 000000000..361289513 --- /dev/null +++ b/multisrc/overrides/madara/projetoscanlator/src/ProjetoScanlator.kt @@ -0,0 +1,20 @@ +package eu.kanade.tachiyomi.extension.pt.projetoscanlator + +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 ProjetoScanlator : Madara( + "Projeto Scanlator", + "https://projetoscanlator.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/ragnarokscan/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/ragnarokscan/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..f7826f05b Binary files /dev/null and b/multisrc/overrides/madara/ragnarokscan/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/ragnarokscan/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/ragnarokscan/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..e1a05c193 Binary files /dev/null and b/multisrc/overrides/madara/ragnarokscan/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/ragnarokscan/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/ragnarokscan/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..af0788f77 Binary files /dev/null and b/multisrc/overrides/madara/ragnarokscan/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/ragnarokscan/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/ragnarokscan/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..de89acb2b Binary files /dev/null and b/multisrc/overrides/madara/ragnarokscan/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/ragnarokscan/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/ragnarokscan/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..4edb85b33 Binary files /dev/null and b/multisrc/overrides/madara/ragnarokscan/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/ragnarokscan/src/RagnarokScan.kt b/multisrc/overrides/madara/ragnarokscan/src/RagnarokScan.kt new file mode 100644 index 000000000..8ffac26c9 --- /dev/null +++ b/multisrc/overrides/madara/ragnarokscan/src/RagnarokScan.kt @@ -0,0 +1,80 @@ +package eu.kanade.tachiyomi.extension.es.ragnarokscan + +import eu.kanade.tachiyomi.multisrc.madara.Madara +import eu.kanade.tachiyomi.multisrc.madara.WordSet +import eu.kanade.tachiyomi.source.model.SChapter +import eu.kanade.tachiyomi.source.model.SManga +import org.jsoup.nodes.Element +import java.text.ParseException +import java.text.SimpleDateFormat +import java.util.Locale + +class RagnarokScan : Madara( + "RagnarokScan", + "https://ragnarokscan.com", + "es", + SimpleDateFormat("MMMMM dd, yyyy", Locale("es")), +) { + // "mangaSubstring" has changed, so users will have to migrate + override val versionId = 2 + override val mangaSubString = "series" + override val chapterUrlSuffix = "" + + 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 + } + + override fun parseChapterDate(date: String?): Long { + date ?: return 0 + + fun SimpleDateFormat.tryParse(string: String): Long { + return try { + parse(string)?.time ?: 0 + } catch (_: ParseException) { + 0 + } + } + + return when { + WordSet("minuto", "minutos", "hora", "horas", "día", "días").endsWith(date) -> { + parseRelativeDate(date) + } + else -> SimpleDateFormat("MMMMM dd, yyyy", Locale("es")).tryParse(date) + } + } +} diff --git a/multisrc/overrides/madara/ragnarokscanlation/src/RagnarokScanlation.kt b/multisrc/overrides/madara/ragnarokscanlation/src/RagnarokScanlation.kt new file mode 100644 index 000000000..0e0b16872 --- /dev/null +++ b/multisrc/overrides/madara/ragnarokscanlation/src/RagnarokScanlation.kt @@ -0,0 +1,7 @@ +package eu.kanade.tachiyomi.extension.es.ragnarokscanlation + +import eu.kanade.tachiyomi.multisrc.madara.Madara +import java.text.SimpleDateFormat +import java.util.Locale + +class RagnarokScanlation : Madara("Ragnarok Scanlation", "https://ragnarokscanlation.com", "es", SimpleDateFormat("MMMM d, yyyy", Locale("es"))) diff --git a/multisrc/overrides/madara/raijinscans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/raijinscans/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..29af9b72a Binary files /dev/null and b/multisrc/overrides/madara/raijinscans/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/raijinscans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/raijinscans/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..d39d6e1e6 Binary files /dev/null and b/multisrc/overrides/madara/raijinscans/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/raijinscans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/raijinscans/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..7ec7dd012 Binary files /dev/null and b/multisrc/overrides/madara/raijinscans/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/raijinscans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/raijinscans/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..4a8728b75 Binary files /dev/null and b/multisrc/overrides/madara/raijinscans/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/raijinscans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/raijinscans/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..e9bbc70e4 Binary files /dev/null and b/multisrc/overrides/madara/raijinscans/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/raijinscans/src/RaijinScans.kt b/multisrc/overrides/madara/raijinscans/src/RaijinScans.kt new file mode 100644 index 000000000..d16a6799c --- /dev/null +++ b/multisrc/overrides/madara/raijinscans/src/RaijinScans.kt @@ -0,0 +1,7 @@ +package eu.kanade.tachiyomi.extension.fr.raijinscans + +import eu.kanade.tachiyomi.multisrc.madara.Madara +import java.text.SimpleDateFormat +import java.util.Locale + +class RaijinScans : Madara("Raijin Scans", "https://raijinscans.fr", "fr", dateFormat = SimpleDateFormat("dd/MM/yyyy", Locale.FRENCH)) diff --git a/multisrc/overrides/madara/rainbowfairyscan/src/RainbowFairyScan.kt b/multisrc/overrides/madara/rainbowfairyscan/src/RainbowFairyScan.kt new file mode 100644 index 000000000..ae5798c56 --- /dev/null +++ b/multisrc/overrides/madara/rainbowfairyscan/src/RainbowFairyScan.kt @@ -0,0 +1,23 @@ +package eu.kanade.tachiyomi.extension.pt.rainbowfairyscan + +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 RainbowFairyScan : Madara( + "Rainbow Fairy Scan", + "https://rainbowfairyscan.com", + "pt-BR", + SimpleDateFormat("dd/MM/yyyy", Locale("pt", "BR")), +) { + + override val client: OkHttpClient = super.client.newBuilder() + .rateLimit(1, 2, TimeUnit.SECONDS) + .build() + + // Page has custom link to scan website. + override val popularMangaUrlSelector = "div.post-title a:not([target])" +} diff --git a/multisrc/overrides/madara/randomscan/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/randomscan/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..f62e8615c Binary files /dev/null and b/multisrc/overrides/madara/randomscan/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/randomscan/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/randomscan/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..157bc3c4f Binary files /dev/null and b/multisrc/overrides/madara/randomscan/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/randomscan/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/randomscan/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..b96d3d339 Binary files /dev/null and b/multisrc/overrides/madara/randomscan/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/randomscan/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/randomscan/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..c3ee34eca Binary files /dev/null and b/multisrc/overrides/madara/randomscan/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/randomscan/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/randomscan/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..0e0bba2af Binary files /dev/null and b/multisrc/overrides/madara/randomscan/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/randomscan/src/RandomScan.kt b/multisrc/overrides/madara/randomscan/src/RandomScan.kt new file mode 100644 index 000000000..dd72ddad5 --- /dev/null +++ b/multisrc/overrides/madara/randomscan/src/RandomScan.kt @@ -0,0 +1,22 @@ +package eu.kanade.tachiyomi.extension.pt.randomscan + +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 RandomScan : Madara( + "Random Scan", + "https://randomscanlators.net", + "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/rawdex/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/rawdex/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..7ddf1cf26 Binary files /dev/null and b/multisrc/overrides/madara/rawdex/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/rawdex/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/rawdex/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..2fb8b4b8a Binary files /dev/null and b/multisrc/overrides/madara/rawdex/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/rawdex/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/rawdex/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..2a7c306be Binary files /dev/null and b/multisrc/overrides/madara/rawdex/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/rawdex/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/rawdex/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..0927cbfe4 Binary files /dev/null and b/multisrc/overrides/madara/rawdex/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/rawdex/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/rawdex/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..ef54b9e9e Binary files /dev/null and b/multisrc/overrides/madara/rawdex/res/mipmap-xxxhdpi/ic_launcher.png differ 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 000000000..46076aec5 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 000000000..bb77a4f8c 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 000000000..26f49e502 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 000000000..48a855d25 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 000000000..ecaf51d16 Binary files /dev/null and b/multisrc/overrides/madara/readergen/res/mipmap-xxxhdpi/ic_launcher.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 000000000..4127e93bf --- /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/readfreecomics/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/readfreecomics/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..f66b6a7fb Binary files /dev/null and b/multisrc/overrides/madara/readfreecomics/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/readfreecomics/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/readfreecomics/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..7a617d9f4 Binary files /dev/null and b/multisrc/overrides/madara/readfreecomics/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/readfreecomics/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/readfreecomics/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..859a4d769 Binary files /dev/null and b/multisrc/overrides/madara/readfreecomics/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/readfreecomics/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/readfreecomics/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..e5cc93043 Binary files /dev/null and b/multisrc/overrides/madara/readfreecomics/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/readfreecomics/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/readfreecomics/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..880164a36 Binary files /dev/null and b/multisrc/overrides/madara/readfreecomics/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/readfreecomics/src/ReadFreeComics.kt b/multisrc/overrides/madara/readfreecomics/src/ReadFreeComics.kt new file mode 100644 index 000000000..489046484 --- /dev/null +++ b/multisrc/overrides/madara/readfreecomics/src/ReadFreeComics.kt @@ -0,0 +1,7 @@ +package eu.kanade.tachiyomi.extension.en.readfreecomics + +import eu.kanade.tachiyomi.multisrc.madara.Madara + +class ReadFreeComics : Madara("ReadFreeComics", "https://readfreecomics.com", "en") { + override val useNewChapterEndpoint = true +} diff --git a/multisrc/overrides/madara/readmangafree/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/readmangafree/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..8e69c7952 Binary files /dev/null and b/multisrc/overrides/madara/readmangafree/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/readmangafree/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/readmangafree/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..e066eb08f Binary files /dev/null and b/multisrc/overrides/madara/readmangafree/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/readmangafree/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/readmangafree/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..e1be220b3 Binary files /dev/null and b/multisrc/overrides/madara/readmangafree/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/readmangafree/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/readmangafree/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..ca4b6de4c Binary files /dev/null and b/multisrc/overrides/madara/readmangafree/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/readmangafree/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/readmangafree/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..86f49f4d8 Binary files /dev/null and b/multisrc/overrides/madara/readmangafree/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/readmangafree/src/ReadMangaFree.kt b/multisrc/overrides/madara/readmangafree/src/ReadMangaFree.kt new file mode 100644 index 000000000..ea57dbe56 --- /dev/null +++ b/multisrc/overrides/madara/readmangafree/src/ReadMangaFree.kt @@ -0,0 +1,7 @@ +package eu.kanade.tachiyomi.extension.en.readmangafree + +import eu.kanade.tachiyomi.multisrc.madara.Madara + +class ReadMangaFree : Madara("ReadMangaFree", "https://readmangafree.net", "en") { + override val useNewChapterEndpoint = false +} diff --git a/multisrc/overrides/madara/readmanhua/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/readmanhua/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..fe3d9d253 Binary files /dev/null and b/multisrc/overrides/madara/readmanhua/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/readmanhua/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/readmanhua/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..baa810f52 Binary files /dev/null and b/multisrc/overrides/madara/readmanhua/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/readmanhua/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/readmanhua/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..264fae33a Binary files /dev/null and b/multisrc/overrides/madara/readmanhua/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/readmanhua/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/readmanhua/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..25f71834f Binary files /dev/null and b/multisrc/overrides/madara/readmanhua/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/readmanhua/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/readmanhua/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..0f87a348f Binary files /dev/null and b/multisrc/overrides/madara/readmanhua/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/readmanhua/src/ReadManhua.kt b/multisrc/overrides/madara/readmanhua/src/ReadManhua.kt new file mode 100644 index 000000000..401242795 --- /dev/null +++ b/multisrc/overrides/madara/readmanhua/src/ReadManhua.kt @@ -0,0 +1,36 @@ +package eu.kanade.tachiyomi.extension.en.readmanhua + +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.Calendar +import java.util.Locale + +class ReadManhua : Madara( + "ReadManhua", + "https://readmanhua.net", + "en", + dateFormat = SimpleDateFormat("dd MMM yyyy", Locale.US), +) { + + override fun chapterFromElement(element: Element): SChapter { + val chapter = SChapter.create() + val year = Calendar.getInstance().get(Calendar.YEAR).toLong() + + 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.text() + } + + // Dates can be part of a "new" graphic or plain text + chapter.date_upload = select("img").firstOrNull()?.attr("alt")?.let { parseRelativeDate(it) } + ?: parseChapterDate(select("span.chapter-release-date i").firstOrNull()?.text() + " " + year) + } + + return chapter + } +} diff --git a/multisrc/overrides/madara/reaperscans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/reaperscans/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..f6c5fc5a7 Binary files /dev/null and b/multisrc/overrides/madara/reaperscans/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/reaperscans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/reaperscans/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..e7ffd65f3 Binary files /dev/null and b/multisrc/overrides/madara/reaperscans/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/reaperscans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/reaperscans/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..d79fd54e9 Binary files /dev/null and b/multisrc/overrides/madara/reaperscans/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/reaperscans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/reaperscans/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..779d9aea3 Binary files /dev/null and b/multisrc/overrides/madara/reaperscans/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/reaperscans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/reaperscans/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..08a0864d9 Binary files /dev/null and b/multisrc/overrides/madara/reaperscans/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/reaperscans/src/ReaperScansFactory.kt b/multisrc/overrides/madara/reaperscans/src/ReaperScansFactory.kt new file mode 100644 index 000000000..8f0707466 --- /dev/null +++ b/multisrc/overrides/madara/reaperscans/src/ReaperScansFactory.kt @@ -0,0 +1,59 @@ +package eu.kanade.tachiyomi.extension.all.reaperscans + +import eu.kanade.tachiyomi.multisrc.madara.Madara +import eu.kanade.tachiyomi.source.SourceFactory +import eu.kanade.tachiyomi.source.model.SChapter +import okhttp3.HttpUrl.Companion.toHttpUrl +import org.jsoup.nodes.Element +import java.text.SimpleDateFormat +import java.util.Locale + +class ReaperScansFactory : SourceFactory { + override fun createSources() = listOf( + ReaperScansTr(), + ReaperScansFr(), + ) +} + +abstract class ReaperScans( + override val baseUrl: String, + lang: String, + dateFormat: SimpleDateFormat = SimpleDateFormat("MMMM dd, yyyy", Locale.US), +) : Madara("Reaper Scans", baseUrl, lang, dateFormat) { + + override fun chapterFromElement(element: Element): SChapter = SChapter.create().apply { + val urlElement = element.selectFirst(chapterUrlSelector)!! + + name = urlElement.selectFirst("p.chapter-manhwa-title")?.text() + ?: urlElement.ownText() + 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() + + setUrlWithoutDomain(fixedUrl) + } +} + +class ReaperScansTr : ReaperScans( + "https://reaperscanstr.com", + "tr", + SimpleDateFormat("MMMMM dd, yyyy", Locale("tr")), +) { + + // Tags are useless as they are just SEO keywords. + override val mangaDetailsSelectorTag = "" +} + +class ReaperScansFr : ReaperScans( + "https://reaperscans.fr", + "fr", + SimpleDateFormat("dd/MM/yyyy", Locale.US), +) { + + // Migrated from WpMangaReader to Madara. + override val versionId = 2 +} diff --git a/multisrc/overrides/madara/rh2plusmanga/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/rh2plusmanga/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..1637ca3ac Binary files /dev/null and b/multisrc/overrides/madara/rh2plusmanga/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/rh2plusmanga/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/rh2plusmanga/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..5d4c80157 Binary files /dev/null and b/multisrc/overrides/madara/rh2plusmanga/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/rh2plusmanga/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/rh2plusmanga/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..dd82c8dcb Binary files /dev/null and b/multisrc/overrides/madara/rh2plusmanga/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/rh2plusmanga/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/rh2plusmanga/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..e91389392 Binary files /dev/null and b/multisrc/overrides/madara/rh2plusmanga/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/rh2plusmanga/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/rh2plusmanga/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..2c7b900bd Binary files /dev/null and b/multisrc/overrides/madara/rh2plusmanga/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/rh2plusmanga/src/Rh2PlusManga.kt b/multisrc/overrides/madara/rh2plusmanga/src/Rh2PlusManga.kt new file mode 100644 index 000000000..baddef60e --- /dev/null +++ b/multisrc/overrides/madara/rh2plusmanga/src/Rh2PlusManga.kt @@ -0,0 +1,11 @@ +package eu.kanade.tachiyomi.extension.th.rh2plusmanga + +import eu.kanade.tachiyomi.multisrc.madara.Madara +import java.text.SimpleDateFormat +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 000000000..904d2f9a4 --- /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 000000000..80bbe4c25 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 000000000..ebdff0165 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 000000000..a5e115d91 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 000000000..733a0120e 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 000000000..a1784a3fd Binary files /dev/null and b/multisrc/overrides/madara/rightdarkscan/res/mipmap-xxxhdpi/ic_launcher.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 000000000..6a328f797 --- /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/rio2manga/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/rio2manga/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..0e1626225 Binary files /dev/null and b/multisrc/overrides/madara/rio2manga/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/rio2manga/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/rio2manga/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..59c185683 Binary files /dev/null and b/multisrc/overrides/madara/rio2manga/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/rio2manga/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/rio2manga/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..8f802e24c Binary files /dev/null and b/multisrc/overrides/madara/rio2manga/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/rio2manga/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/rio2manga/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..e6772a6e5 Binary files /dev/null and b/multisrc/overrides/madara/rio2manga/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/rio2manga/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/rio2manga/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..b665cf141 Binary files /dev/null and b/multisrc/overrides/madara/rio2manga/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/rio2manga/src/Rio2Manga.kt b/multisrc/overrides/madara/rio2manga/src/Rio2Manga.kt new file mode 100644 index 000000000..95dee4c17 --- /dev/null +++ b/multisrc/overrides/madara/rio2manga/src/Rio2Manga.kt @@ -0,0 +1,7 @@ +package eu.kanade.tachiyomi.extension.en.rio2manga + +import eu.kanade.tachiyomi.multisrc.madara.Madara + +class Rio2Manga : Madara("Rio2 Manga", "https://rio2manga.com", "en") { + override val useNewChapterEndpoint = true +} diff --git a/multisrc/overrides/madara/romantikmanga/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/romantikmanga/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..064b22466 Binary files /dev/null and b/multisrc/overrides/madara/romantikmanga/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/romantikmanga/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/romantikmanga/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..a0063888d Binary files /dev/null and b/multisrc/overrides/madara/romantikmanga/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/romantikmanga/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/romantikmanga/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..e8076e262 Binary files /dev/null and b/multisrc/overrides/madara/romantikmanga/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/romantikmanga/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/romantikmanga/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..2faa77d86 Binary files /dev/null and b/multisrc/overrides/madara/romantikmanga/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/romantikmanga/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/romantikmanga/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..d6bf0a26a Binary files /dev/null and b/multisrc/overrides/madara/romantikmanga/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/romantikmanga/src/RomantikManga.kt b/multisrc/overrides/madara/romantikmanga/src/RomantikManga.kt new file mode 100644 index 000000000..464603f2a --- /dev/null +++ b/multisrc/overrides/madara/romantikmanga/src/RomantikManga.kt @@ -0,0 +1,14 @@ +package eu.kanade.tachiyomi.extension.tr.romantikmanga + +import eu.kanade.tachiyomi.multisrc.madara.Madara +import java.text.SimpleDateFormat +import java.util.Locale + +class RomantikManga : Madara( + "Romantik Manga", + "https://romantikmanga.com", + "tr", + dateFormat = SimpleDateFormat("MMM d, yyy", Locale("tr")), +) { + override val useNewChapterEndpoint = true +} diff --git a/multisrc/overrides/madara/ruyamanga/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/ruyamanga/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..8dc3b8772 Binary files /dev/null and b/multisrc/overrides/madara/ruyamanga/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/ruyamanga/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/ruyamanga/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..0d5aba843 Binary files /dev/null and b/multisrc/overrides/madara/ruyamanga/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/ruyamanga/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/ruyamanga/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..9f4386b78 Binary files /dev/null and b/multisrc/overrides/madara/ruyamanga/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/ruyamanga/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/ruyamanga/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..4a60574df Binary files /dev/null and b/multisrc/overrides/madara/ruyamanga/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/ruyamanga/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/ruyamanga/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..c5fe925fa Binary files /dev/null and b/multisrc/overrides/madara/ruyamanga/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/ruyamanga/src/RuyaManga.kt b/multisrc/overrides/madara/ruyamanga/src/RuyaManga.kt new file mode 100644 index 000000000..2fe40b66d --- /dev/null +++ b/multisrc/overrides/madara/ruyamanga/src/RuyaManga.kt @@ -0,0 +1,7 @@ +package eu.kanade.tachiyomi.extension.tr.ruyamanga + +import eu.kanade.tachiyomi.multisrc.madara.Madara +import java.text.SimpleDateFormat +import java.util.Locale + +class RuyaManga : Madara("Rüya Manga", "https://www.ruyamanga.com", "tr", SimpleDateFormat("dd MMMM yyyy", Locale.forLanguageTag("tr"))) diff --git a/multisrc/overrides/madara/s2manga/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/s2manga/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..78aed8f9d Binary files /dev/null and b/multisrc/overrides/madara/s2manga/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/s2manga/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/s2manga/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..57b0e935b Binary files /dev/null and b/multisrc/overrides/madara/s2manga/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/s2manga/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/s2manga/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..60ac860b9 Binary files /dev/null and b/multisrc/overrides/madara/s2manga/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/s2manga/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/s2manga/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..6201c85ab Binary files /dev/null and b/multisrc/overrides/madara/s2manga/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/s2manga/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/s2manga/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..ed057db6b Binary files /dev/null and b/multisrc/overrides/madara/s2manga/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/s2manga/src/S2Manga.kt b/multisrc/overrides/madara/s2manga/src/S2Manga.kt new file mode 100644 index 000000000..017949318 --- /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/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/samuraiscan/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..6d4b03552 Binary files /dev/null and b/multisrc/overrides/madara/samuraiscan/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/samuraiscan/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/samuraiscan/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..eea4dc0dd Binary files /dev/null and b/multisrc/overrides/madara/samuraiscan/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/samuraiscan/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/samuraiscan/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..7db882923 Binary files /dev/null and b/multisrc/overrides/madara/samuraiscan/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/samuraiscan/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/samuraiscan/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..fe4ebf4a6 Binary files /dev/null and b/multisrc/overrides/madara/samuraiscan/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/samuraiscan/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/samuraiscan/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..14f7943a5 Binary files /dev/null and b/multisrc/overrides/madara/samuraiscan/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/samuraiscan/src/SamuraiScan.kt b/multisrc/overrides/madara/samuraiscan/src/SamuraiScan.kt new file mode 100644 index 000000000..d08135f51 --- /dev/null +++ b/multisrc/overrides/madara/samuraiscan/src/SamuraiScan.kt @@ -0,0 +1,17 @@ +package eu.kanade.tachiyomi.extension.es.samuraiscan + +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")), +) { + 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/sawamics/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/sawamics/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..4ee1870bc Binary files /dev/null and b/multisrc/overrides/madara/sawamics/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/sawamics/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/sawamics/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..75c1a14c3 Binary files /dev/null and b/multisrc/overrides/madara/sawamics/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/sawamics/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/sawamics/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..9b792851b Binary files /dev/null and b/multisrc/overrides/madara/sawamics/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/sawamics/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/sawamics/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..a3e688cc0 Binary files /dev/null and b/multisrc/overrides/madara/sawamics/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/sawamics/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/sawamics/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..c1ca1f334 Binary files /dev/null and b/multisrc/overrides/madara/sawamics/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/scambertraslator/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/scambertraslator/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..c11535c68 Binary files /dev/null and b/multisrc/overrides/madara/scambertraslator/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/scambertraslator/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/scambertraslator/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..bc231dd36 Binary files /dev/null and b/multisrc/overrides/madara/scambertraslator/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/scambertraslator/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/scambertraslator/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..6efe0e392 Binary files /dev/null and b/multisrc/overrides/madara/scambertraslator/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/scambertraslator/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/scambertraslator/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..a446b5ee0 Binary files /dev/null and b/multisrc/overrides/madara/scambertraslator/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/scambertraslator/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/scambertraslator/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..f417ff264 Binary files /dev/null and b/multisrc/overrides/madara/scambertraslator/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/scambertraslator/src/ScamberTraslator.kt b/multisrc/overrides/madara/scambertraslator/src/ScamberTraslator.kt new file mode 100644 index 000000000..7894775e8 --- /dev/null +++ b/multisrc/overrides/madara/scambertraslator/src/ScamberTraslator.kt @@ -0,0 +1,14 @@ +package eu.kanade.tachiyomi.extension.es.scambertraslator + +import eu.kanade.tachiyomi.multisrc.madara.Madara +import java.text.SimpleDateFormat +import java.util.Locale + +class ScamberTraslator : Madara( + "ScamberTraslator", + "https://scambertraslator.com", + "es", + dateFormat = SimpleDateFormat("dd/MM/yyyy", Locale("es")), +) { + override val useNewChapterEndpoint = true +} diff --git a/multisrc/overrides/madara/scanhentaimenu/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/scanhentaimenu/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..3920023c0 Binary files /dev/null and b/multisrc/overrides/madara/scanhentaimenu/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/scanhentaimenu/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/scanhentaimenu/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..c995dcc72 Binary files /dev/null and b/multisrc/overrides/madara/scanhentaimenu/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/scanhentaimenu/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/scanhentaimenu/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..104cbedf1 Binary files /dev/null and b/multisrc/overrides/madara/scanhentaimenu/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/scanhentaimenu/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/scanhentaimenu/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..2d61561eb Binary files /dev/null and b/multisrc/overrides/madara/scanhentaimenu/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/scanhentaimenu/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/scanhentaimenu/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..15867a3fb Binary files /dev/null and b/multisrc/overrides/madara/scanhentaimenu/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/scanhentaimenu/src/ScanHentaiMenu.kt b/multisrc/overrides/madara/scanhentaimenu/src/ScanHentaiMenu.kt new file mode 100644 index 000000000..6b3d89984 --- /dev/null +++ b/multisrc/overrides/madara/scanhentaimenu/src/ScanHentaiMenu.kt @@ -0,0 +1,7 @@ +package eu.kanade.tachiyomi.extension.fr.scanhentaimenu + +import eu.kanade.tachiyomi.multisrc.madara.Madara +import java.text.SimpleDateFormat +import java.util.Locale + +class ScanHentaiMenu : Madara("Scan Hentai Menu", "https://scan.hentai.menu", "fr", dateFormat = SimpleDateFormat("MMMM d, yyyy", Locale.FRENCH)) diff --git a/multisrc/overrides/madara/scantradvf/src/ScantradVF.kt b/multisrc/overrides/madara/scantradvf/src/ScantradVF.kt new file mode 100644 index 000000000..68bf18549 --- /dev/null +++ b/multisrc/overrides/madara/scantradvf/src/ScantradVF.kt @@ -0,0 +1,10 @@ +package eu.kanade.tachiyomi.extension.fr.scantradvf + +import eu.kanade.tachiyomi.multisrc.madara.Madara +import java.text.SimpleDateFormat +import java.util.Locale + +class ScantradVF : Madara("Scantrad-VF", "https://scantrad-vf.co", "fr", SimpleDateFormat("d MMMM yyyy", Locale.FRENCH)) { + override val filterNonMangaItems = false + override val useNewChapterEndpoint = true +} diff --git a/multisrc/overrides/madara/sdlscans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/sdlscans/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..a291e5926 Binary files /dev/null and b/multisrc/overrides/madara/sdlscans/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/sdlscans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/sdlscans/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..2f4ab4761 Binary files /dev/null and b/multisrc/overrides/madara/sdlscans/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/sdlscans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/sdlscans/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..0914c309a Binary files /dev/null and b/multisrc/overrides/madara/sdlscans/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/sdlscans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/sdlscans/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..9a6d1884f Binary files /dev/null and b/multisrc/overrides/madara/sdlscans/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/sdlscans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/sdlscans/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..a1856237c Binary files /dev/null and b/multisrc/overrides/madara/sdlscans/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/sdlscans/src/SdlScans.kt b/multisrc/overrides/madara/sdlscans/src/SdlScans.kt new file mode 100644 index 000000000..a8a5e3e34 --- /dev/null +++ b/multisrc/overrides/madara/sdlscans/src/SdlScans.kt @@ -0,0 +1,7 @@ +package eu.kanade.tachiyomi.extension.es.sdlscans + +import eu.kanade.tachiyomi.multisrc.madara.Madara +import java.text.SimpleDateFormat +import java.util.Locale + +class SdlScans : Madara("Sdl scans", "https://sdlscans.com", "es", SimpleDateFormat("MMMMM dd, yyyy", Locale("es"))) 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 000000000..c751ecee6 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 000000000..b87862687 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 000000000..55c42162b 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 000000000..7ccc160b0 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 000000000..26ada4639 Binary files /dev/null and b/multisrc/overrides/madara/shadowtrad/res/mipmap-xxxhdpi/ic_launcher.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 000000000..8a3250f31 --- /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/shavelproiection/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/shavelproiection/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..883d6a018 Binary files /dev/null and b/multisrc/overrides/madara/shavelproiection/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/shavelproiection/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/shavelproiection/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..6526d896b Binary files /dev/null and b/multisrc/overrides/madara/shavelproiection/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/shavelproiection/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/shavelproiection/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..010eb6af6 Binary files /dev/null and b/multisrc/overrides/madara/shavelproiection/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/shavelproiection/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/shavelproiection/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..43decf6c4 Binary files /dev/null and b/multisrc/overrides/madara/shavelproiection/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/shavelproiection/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/shavelproiection/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..28407396f Binary files /dev/null and b/multisrc/overrides/madara/shavelproiection/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/shavelproiection/src/ShavelProiection.kt b/multisrc/overrides/madara/shavelproiection/src/ShavelProiection.kt new file mode 100644 index 000000000..fe224dd96 --- /dev/null +++ b/multisrc/overrides/madara/shavelproiection/src/ShavelProiection.kt @@ -0,0 +1,7 @@ +package eu.kanade.tachiyomi.extension.it.shavelproiection + +import eu.kanade.tachiyomi.multisrc.madara.Madara +import java.text.SimpleDateFormat +import java.util.Locale + +class ShavelProiection : Madara("ShavelProiection", "https://www.shavelproiection.com", "it", dateFormat = SimpleDateFormat("d MMM yyy", Locale("it"))) diff --git a/multisrc/overrides/madara/shayami/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/shayami/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..634123625 Binary files /dev/null and b/multisrc/overrides/madara/shayami/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/shayami/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/shayami/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..025a367c7 Binary files /dev/null and b/multisrc/overrides/madara/shayami/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/shayami/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/shayami/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..cd881d7f5 Binary files /dev/null and b/multisrc/overrides/madara/shayami/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/shayami/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/shayami/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..6d0d6ea35 Binary files /dev/null and b/multisrc/overrides/madara/shayami/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/shayami/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/shayami/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..743ef699e Binary files /dev/null and b/multisrc/overrides/madara/shayami/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/shayami/src/Shayami.kt b/multisrc/overrides/madara/shayami/src/Shayami.kt new file mode 100644 index 000000000..aeead055c --- /dev/null +++ b/multisrc/overrides/madara/shayami/src/Shayami.kt @@ -0,0 +1,14 @@ +package eu.kanade.tachiyomi.extension.es.shayami + +import eu.kanade.tachiyomi.multisrc.madara.Madara +import java.text.SimpleDateFormat +import java.util.Locale + +class Shayami : Madara( + "Shayami", + "https://shayami.com", + "es", + dateFormat = SimpleDateFormat("MMM d, yyy", Locale("es")), +) { + override val useNewChapterEndpoint = true +} 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 000000000..ae815a305 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 000000000..c98bb9507 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 000000000..6d5ce5e47 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 000000000..cb79d239f 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 000000000..0be1e33a8 Binary files /dev/null and b/multisrc/overrides/madara/shibamanga/res/mipmap-xxxhdpi/ic_launcher.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 000000000..e37cf7b74 --- /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/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/shieldmanga/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..a4a4ba5b8 Binary files /dev/null and b/multisrc/overrides/madara/shieldmanga/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/shieldmanga/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/shieldmanga/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..07362ffd9 Binary files /dev/null and b/multisrc/overrides/madara/shieldmanga/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/shieldmanga/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/shieldmanga/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..91036ee80 Binary files /dev/null and b/multisrc/overrides/madara/shieldmanga/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/shieldmanga/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/shieldmanga/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..0c2e92c05 Binary files /dev/null and b/multisrc/overrides/madara/shieldmanga/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/shieldmanga/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/shieldmanga/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..4a8b7e763 Binary files /dev/null and b/multisrc/overrides/madara/shieldmanga/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/shieldmanga/src/ShieldManga.kt b/multisrc/overrides/madara/shieldmanga/src/ShieldManga.kt new file mode 100644 index 000000000..e33716ae3 --- /dev/null +++ b/multisrc/overrides/madara/shieldmanga/src/ShieldManga.kt @@ -0,0 +1,17 @@ +package eu.kanade.tachiyomi.extension.en.shieldmanga + +import eu.kanade.tachiyomi.multisrc.madara.Madara +import eu.kanade.tachiyomi.network.interceptor.rateLimit +import okhttp3.OkHttpClient + +class ShieldManga : Madara("Shield Manga", "https://shieldmanga.io", "en") { + + override val client: OkHttpClient = super.client.newBuilder() + .rateLimit(1) + .build() + + // The website does not flag the content. + override val filterNonMangaItems = false + + override fun chapterListSelector() = "li.wp-manga-hapter, .version-chap li" +} diff --git a/multisrc/overrides/madara/shinigami/additional.gradle b/multisrc/overrides/madara/shinigami/additional.gradle new file mode 100644 index 000000000..56e3d5c86 --- /dev/null +++ b/multisrc/overrides/madara/shinigami/additional.gradle @@ -0,0 +1,3 @@ +dependencies { + implementation(project(":lib-synchrony")) +} diff --git a/multisrc/overrides/madara/shinigami/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/shinigami/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..bdee42621 Binary files /dev/null and b/multisrc/overrides/madara/shinigami/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/shinigami/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/shinigami/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..ed4093394 Binary files /dev/null and b/multisrc/overrides/madara/shinigami/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/shinigami/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/shinigami/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..2e117fba7 Binary files /dev/null and b/multisrc/overrides/madara/shinigami/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/shinigami/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/shinigami/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..99d44dd47 Binary files /dev/null and b/multisrc/overrides/madara/shinigami/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/shinigami/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/shinigami/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..ae54204ec Binary files /dev/null and b/multisrc/overrides/madara/shinigami/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/shinigami/src/Shinigami.kt b/multisrc/overrides/madara/shinigami/src/Shinigami.kt new file mode 100644 index 000000000..c2d7e1445 --- /dev/null +++ b/multisrc/overrides/madara/shinigami/src/Shinigami.kt @@ -0,0 +1,211 @@ +package eu.kanade.tachiyomi.extension.id.shinigami + +import android.app.Application +import android.content.SharedPreferences +import android.util.Base64 +import android.widget.Toast +import androidx.preference.EditTextPreference +import androidx.preference.PreferenceScreen +import eu.kanade.tachiyomi.lib.cryptoaes.CryptoAES +import eu.kanade.tachiyomi.lib.synchrony.Deobfuscator +import eu.kanade.tachiyomi.multisrc.madara.Madara +import eu.kanade.tachiyomi.network.GET +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.Interceptor +import okhttp3.OkHttpClient +import okhttp3.Response +import org.jsoup.nodes.Document +import org.jsoup.nodes.Element +import uy.kohesive.injekt.Injekt +import uy.kohesive.injekt.api.get +import java.io.IOException +import java.util.concurrent.TimeUnit + +class Shinigami : Madara("Shinigami", "https://shinigami.moe", "id") { + // moved from Reaper Scans (id) to Shinigami (id) + override val id = 3411809758861089969 + + override val useNewChapterEndpoint = false + + override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/" + + private val preferences: SharedPreferences by lazy { + Injekt.get().getSharedPreferences("source_$id", 0x0000) + } + + private val encodedString = "AAA AaAAAAH QAAAB0 AAAAcA AAAHMAA AA6AAA ALwAAAC8AA " + "AB0AAAAYQA AAGM AAADoAAAAaQAAAH kAAABvAA AAbQAAA GkAAABvAAAA cgAAAGcAAAAuAAA AZwAAAGk " + "AAAB0AAAA aAAAAHUAA ABiAAAALgAAAGkAA ABvAAAAL wAAAHUAAABzA AAAZQAAAHIAAAAtA AAAYQAAAGcA " + "AABlyAtAAAbgA AAHQAAAB6AAAA LwAAAHUAAA BcAAAAZQ AAAHIAAAAtAAA AYQAAAGcAAABl AAAAbgAA AHQAAAB6AAAALgAAAG" + " oAhAntUAABzAA AAbwAAAG4=" + + private val tachiUaUrl = Base64.decode(encodedString.replace("\\s".toRegex(), "").replace("DoA", "BoA").replace("GoAhAntU", "GoA").replace("BlyAt", "BlA").replace("BcA", "BzA"), Base64.DEFAULT).toString(Charsets.UTF_32).replace("z", "s") + + private var secChUaMP: List? = null + private var userAgent: String? = null + private var checkedUa = false + + private val uaIntercept = object : Interceptor { + override fun intercept(chain: Interceptor.Chain): Response { + val customUa = preferences.getString(PREF_KEY_CUSTOM_UA, "") + try { + if (customUa!!.isNotBlank()) userAgent = customUa + + if (userAgent.isNullOrBlank() && checkedUa.not()) { + val uaResponse = chain.proceed(GET(tachiUaUrl)) + if (uaResponse.isSuccessful) { + val parseTachiUa = uaResponse.use { json.decodeFromString(it.body.string()) } + + var listUserAgentString = parseTachiUa.desktop + parseTachiUa.mobile + + listUserAgentString = listUserAgentString!!.filter { + listOf("windows", "android").any { filter -> + it.contains(filter, ignoreCase = true) + } + } + userAgent = listUserAgentString!!.random() + checkedUa = true + } + uaResponse.close() + } + + if (userAgent.isNullOrBlank().not()) { + secChUaMP = if (userAgent!!.contains("Windows")) { + listOf("?0", "Windows") + } else { + listOf("?1", "Android") + } + + val newRequest = chain.request().newBuilder() + .header("User-Agent", userAgent!!.trim()) + .header("Sec-CH-UA-Mobile", secChUaMP!![0]) + .header("Sec-CH-UA-Platform", secChUaMP!![1]) + .removeHeader("X-Requested-With") + .build() + + return chain.proceed(newRequest) + } + return chain.proceed(chain.request()) + } catch (e: Exception) { + throw IOException(e.message) + } + } + } + + @Serializable + data class TachiUaResponse( + val desktop: List = emptyList(), + val mobile: List = emptyList(), + ) + + // disable random ua in ext setting from multisrc (.setRandomUserAgent) + override val client: OkHttpClient = network.cloudflareClient.newBuilder() + .addInterceptor(uaIntercept) + .connectTimeout(10, TimeUnit.SECONDS) + .readTimeout(30, TimeUnit.SECONDS) + .build() + + override fun headersBuilder(): Headers.Builder { + val builder = super.headersBuilder() + .add("Sec-Fetch-Dest", "document") + .add("Sec-Fetch-Mode", "navigate") + .add("Sec-Fetch-Site", "same-origin") + .add("Upgrade-Insecure-Requests", "1") + .add("X-Requested-With", "") // added for webview, and removed in interceptor for normal use + + // used to flush tachi custom ua in webview and use system ua instead + if (userAgent.isNullOrBlank()) builder.removeAll("User-Agent") + + return builder + } + + override val mangaSubString = "semua-series" + + // Tags are useless as they are just SEO keywords. + override val mangaDetailsSelectorTag = "" + + override fun chapterFromElement(element: Element): SChapter = SChapter.create().apply { + val urlElement = element.selectFirst(chapterUrlSelector)!! + + name = urlElement.selectFirst("p.chapter-manhwa-title")?.text() + ?: urlElement.ownText() + date_upload = urlElement.selectFirst("span.chapter-release-date > i")?.text() + .let { parseChapterDate(it) } + + val fixedUrl = urlElement.attr("abs:href") + + setUrlWithoutDomain(fixedUrl) + } + + // Page list + @Serializable + data class CDT(val ct: String, val s: String) + + override fun pageListParse(document: Document): List { + val script = document.selectFirst("script:containsData(chapter_data)")?.data() + ?: throw Exception("chapter_data script not found") + + val deobfuscated = Deobfuscator.deobfuscateScript(script) + ?: throw Exception("Unable to deobfuscate chapter_data script") + + val postId = script.substringAfter("var post_id = '").substringBefore("'") + val chapterData = json.decodeFromString( + script.substringAfter("var chapter_data = '").substringBefore("'"), + ) + + val keyMatch = KEY_REGEX.find(deobfuscated)!!.groupValues + val key = postId + keyMatch[1] + postId + keyMatch[2] + postId + val salt = chapterData.s.decodeHex() + + val unsaltedCiphertext = Base64.decode(chapterData.ct, Base64.DEFAULT) + val ciphertext = SALTED + salt + unsaltedCiphertext + + val decrypted = CryptoAES.decrypt(Base64.encodeToString(ciphertext, Base64.DEFAULT), key) + val data = json.decodeFromString>(decrypted) + return data.mapIndexed { idx, it -> + Page(idx, document.location(), it) + } + } + + // https://stackoverflow.com/a/66614516 + private fun String.decodeHex(): ByteArray { + check(length % 2 == 0) { "Must have an even length" } + + return chunked(2) + .map { it.toInt(16).toByte() } + .toByteArray() + } + + // remove random ua in setting ext from multisrc and use custom one + override fun setupPreferenceScreen(screen: PreferenceScreen) { + val prefCustomUserAgent = EditTextPreference(screen.context).apply { + key = PREF_KEY_CUSTOM_UA + title = TITLE_CUSTOM_UA + summary = (preferences.getString(PREF_KEY_CUSTOM_UA, "")!!.trim() + SUMMARY_STRING_CUSTOM_UA).trim() + setOnPreferenceChangeListener { _, newValue -> + val customUa = newValue as String + preferences.edit().putString(PREF_KEY_CUSTOM_UA, customUa).apply() + if (customUa.isNullOrBlank()) { + Toast.makeText(screen.context, RESTART_APP_STRING, Toast.LENGTH_LONG).show() + } else { + userAgent = null + } + summary = (customUa.trim() + SUMMARY_STRING2_CUSTOM_UA).trim() + + true + } + } + screen.addPreference(prefCustomUserAgent) + } + + companion object { + const val TITLE_CUSTOM_UA = "Custom User-Agent" + const val PREF_KEY_CUSTOM_UA = "pref_key_custom_ua" + const val SUMMARY_STRING_CUSTOM_UA = "\n\nBiarkan kosong untuk menggunakan User-Agent secara random" + const val SUMMARY_STRING2_CUSTOM_UA = "\n\nKosongkan untuk menggunakan User-Agent secara random" + + const val RESTART_APP_STRING = "Restart Tachiyomi untuk menggunakan pengaturan baru." + + private val KEY_REGEX by lazy { Regex("""post_id\s+\+\s+'(.*?)'\s+\+\s+post_id\s+\+\s+'(.*?)'\s+\+\s+post_id""") } + } +} diff --git a/multisrc/overrides/madara/shootingstarscans/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/shootingstarscans/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..b4d4a1a9f Binary files /dev/null and b/multisrc/overrides/madara/shootingstarscans/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/shootingstarscans/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/shootingstarscans/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..e1413cfd0 Binary files /dev/null and b/multisrc/overrides/madara/shootingstarscans/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/shootingstarscans/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/shootingstarscans/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..cd2ed2629 Binary files /dev/null and b/multisrc/overrides/madara/shootingstarscans/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/shootingstarscans/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/shootingstarscans/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..bc23e363d Binary files /dev/null and b/multisrc/overrides/madara/shootingstarscans/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/shootingstarscans/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/shootingstarscans/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..4b4fe4d6b Binary files /dev/null and b/multisrc/overrides/madara/shootingstarscans/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/shoujohearts/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/shoujohearts/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..0fa79d028 Binary files /dev/null and b/multisrc/overrides/madara/shoujohearts/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/shoujohearts/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/shoujohearts/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..d23cc9209 Binary files /dev/null and b/multisrc/overrides/madara/shoujohearts/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/shoujohearts/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/shoujohearts/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..f356639d0 Binary files /dev/null and b/multisrc/overrides/madara/shoujohearts/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/shoujohearts/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/shoujohearts/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..8944a3919 Binary files /dev/null and b/multisrc/overrides/madara/shoujohearts/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/shoujohearts/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/shoujohearts/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..517d3761b Binary files /dev/null and b/multisrc/overrides/madara/shoujohearts/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/shoujohearts/src/ShoujoHearts.kt b/multisrc/overrides/madara/shoujohearts/src/ShoujoHearts.kt new file mode 100644 index 000000000..578d6d3a4 --- /dev/null +++ b/multisrc/overrides/madara/shoujohearts/src/ShoujoHearts.kt @@ -0,0 +1,10 @@ +package eu.kanade.tachiyomi.extension.en.shoujohearts + +import eu.kanade.tachiyomi.multisrc.madara.Madara + +class ShoujoHearts : Madara("ShoujoHearts", "https://shoujohearts.com", "en") { + + override val mangaSubString = "reader/manga" + + override fun searchPage(page: Int): String = "reader/page/$page/" +} diff --git a/multisrc/overrides/madara/sinensis/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/sinensis/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..ff8782a34 Binary files /dev/null and b/multisrc/overrides/madara/sinensis/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/sinensis/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/sinensis/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..21186f907 Binary files /dev/null and b/multisrc/overrides/madara/sinensis/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/sinensis/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/sinensis/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..df5a154c4 Binary files /dev/null and b/multisrc/overrides/madara/sinensis/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/sinensis/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/sinensis/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..bbf8d049d Binary files /dev/null and b/multisrc/overrides/madara/sinensis/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/sinensis/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/sinensis/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..a3fca9203 Binary files /dev/null and b/multisrc/overrides/madara/sinensis/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/sinensis/src/SinensisScan.kt b/multisrc/overrides/madara/sinensis/src/SinensisScan.kt new file mode 100644 index 000000000..26174475e --- /dev/null +++ b/multisrc/overrides/madara/sinensis/src/SinensisScan.kt @@ -0,0 +1,56 @@ +package eu.kanade.tachiyomi.extension.pt.sinensis + +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.HttpUrl.Companion.toHttpUrl +import okhttp3.OkHttpClient +import org.jsoup.nodes.Element +import java.text.SimpleDateFormat +import java.util.Locale +import java.util.concurrent.TimeUnit + +class SinensisScan : Madara( + "Sinensis Scan", + "https://sinensisscan.net", + "pt-BR", + SimpleDateFormat("dd/MM/yyyy", Locale("pt", "BR")), +) { + + // Name changed from Sinensis to Sinensis Scan + override val id: Long = 3891513807564817914 + + override val client: OkHttpClient = super.client.newBuilder() + .rateLimit(1, 2, TimeUnit.SECONDS) + .build() + + override fun popularMangaFromElement(element: Element): SManga { + return super.popularMangaFromElement(element).apply { + setUrlWithoutDomain(url.removeBadPath("manga")) + } + } + + override fun searchMangaFromElement(element: Element): SManga { + return super.searchMangaFromElement(element).apply { + setUrlWithoutDomain(url.removeBadPath("manga")) + } + } + + override fun chapterFromElement(element: Element): SChapter { + return super.chapterFromElement(element).apply { + setUrlWithoutDomain(url.removeBadPath("manga")) + } + } + + private fun String.removeBadPath(expectedFirstPath: String): String { + val fullUrl = if (contains(baseUrl)) this else (baseUrl + this) + val url = fullUrl.toHttpUrl() + + if (url.pathSegments.firstOrNull() != expectedFirstPath) { + return url.newBuilder().removePathSegment(0).toString() + } + + return url.toString() + } +} diff --git a/multisrc/overrides/madara/sisigelap/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/sisigelap/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..ef09ed068 Binary files /dev/null and b/multisrc/overrides/madara/sisigelap/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/sisigelap/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/sisigelap/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..ae0a5a845 Binary files /dev/null and b/multisrc/overrides/madara/sisigelap/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/sisigelap/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/sisigelap/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..632b0038d Binary files /dev/null and b/multisrc/overrides/madara/sisigelap/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/sisigelap/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/sisigelap/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..5e7f32ea0 Binary files /dev/null and b/multisrc/overrides/madara/sisigelap/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/sisigelap/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/sisigelap/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..f8603b75c Binary files /dev/null and b/multisrc/overrides/madara/sisigelap/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/siyahmelek/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/madara/siyahmelek/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..7c7b101e0 Binary files /dev/null and b/multisrc/overrides/madara/siyahmelek/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/siyahmelek/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/madara/siyahmelek/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..32a7a044a Binary files /dev/null and b/multisrc/overrides/madara/siyahmelek/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/siyahmelek/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/madara/siyahmelek/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..f89e7163a Binary files /dev/null and b/multisrc/overrides/madara/siyahmelek/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/siyahmelek/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/madara/siyahmelek/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..67401f97d Binary files /dev/null and b/multisrc/overrides/madara/siyahmelek/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/siyahmelek/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/madara/siyahmelek/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..c85498612 Binary files /dev/null and b/multisrc/overrides/madara/siyahmelek/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/madara/siyahmelek/src/Siyahmelek.kt b/multisrc/overrides/madara/siyahmelek/src/Siyahmelek.kt new file mode 100644 index 000000000..4cc1cb2e7 --- /dev/null +++ b/multisrc/overrides/madara/siyahmelek/src/Siyahmelek.kt @@ -0,0 +1,38 @@ +package eu.kanade.tachiyomi.extension.tr.siyahmelek + +import eu.kanade.tachiyomi.multisrc.madara.Madara +import eu.kanade.tachiyomi.source.model.SChapter +import eu.kanade.tachiyomi.source.model.SManga +import okhttp3.Response +import java.text.SimpleDateFormat +import java.util.Locale + +class Siyahmelek : Madara("Gri Melek", "https://grimelek.net", "tr", SimpleDateFormat("dd MMM yyyy", Locale("tr"))) { + // Siyahmelek (tr) -> Gri Melek (tr) + override val id = 6419959498055001014 + + override val mangaSubString = "seri" + + override val useNewChapterEndpoint = true + + override fun searchPage(page: Int): String = if (page == 1) "" else "page/$page/" + + // Skip fake image + // OK:
+ // NG: