diff --git a/.github/scripts/bump-versions.sh b/.github/scripts/bump-versions.sh
new file mode 100755
index 000000000..2652fa7fb
--- /dev/null
+++ b/.github/scripts/bump-versions.sh
@@ -0,0 +1,49 @@
+#!/bin/bash
+versionStr="extVersionCode ="
+
+getVersion() {
+ # cut -d "=" -f 2 -> string.split("=")[1]
+ # "extVersionCode = 6" -> ["extVersionCode ", " 6"] -> " 6" -> "6"
+ grep "$versionStr" "$1" | cut -d "=" -f 2 | cut -d " " -f 2
+}
+
+bumpVersion() {
+ local file=$1
+ local old_version=$(getVersion $file)
+ local new_version=$((old_version + 1))
+
+ echo -e "\n$file: $old_version -> $new_version\n"
+ sed -i "s/$versionStr $old_version/$versionStr $new_version/" $file
+}
+
+findAndBump() {
+ local bumpedFiles=""
+ for lib in $@; do
+ for file in $(grep -l -R ":lib-$lib" --include "build.gradle"); do
+ # prevent bumping the same extension multiple times
+ if [[ ! $bumpedFiles =~ ( |^)$file( |$) ]]; then
+ bumpedFiles+="$file "
+ bumpVersion $file
+ fi
+ done
+ done
+ commitChanges $bumpedFiles
+}
+
+commitChanges() {
+ # this will NOT trigger another workflow, because it will use $GITHUB_TOKEN.
+ # so the build-action will run fine with the bumped-up extensions
+ if [[ -n "$@" ]]; then
+ git config --global user.email "github-actions[bot]@users.noreply.github.com"
+ git config --global user.name "github-actions[bot]"
+ git add $@
+ git commit -m "Mass-bump on extensions"
+ git push
+ fi
+}
+
+# lib/cryptoaes/build.gradle.kts -> lib/cryptoaes -> cryptoaes
+modified=$(echo $@ | tr " " "\n" | grep -Eo "^lib/\w+" | sort | uniq | cut -c 5-)
+if [[ -n "$modified" ]]; then
+ findAndBump $modified
+fi
diff --git a/.github/workflows/build_push.yml b/.github/workflows/build_push.yml
index a92c27352..c13cf62a1 100644
--- a/.github/workflows/build_push.yml
+++ b/.github/workflows/build_push.yml
@@ -29,6 +29,19 @@ jobs:
- name: Clone repo
uses: actions/checkout@v3
+ - name: Find lib changes
+ id: modified-libs
+ uses: tj-actions/changed-files@v32
+ with:
+ files: lib/**
+ files_ignore: lib/**.md
+ files_separator: " "
+ # This step is going to commit, but this will not trigger another workflow.
+ - name: Bump extensions that uses a modified lib
+ if: steps.modified-libs.outputs.any_changed == 'true'
+ run: |
+ ./.github/scripts/bump-versions.sh ${{ steps.modified-libs.outputs.all_changed_files }}
+
- name: Validate Gradle Wrapper
uses: gradle/wrapper-validation-action@v1
diff --git a/lib/dood-extractor/build.gradle.kts b/lib/dood-extractor/build.gradle.kts
new file mode 100644
index 000000000..1c2f5bc51
--- /dev/null
+++ b/lib/dood-extractor/build.gradle.kts
@@ -0,0 +1,24 @@
+plugins {
+ id("com.android.library")
+ kotlin("android")
+}
+
+android {
+ compileSdk = AndroidConfig.compileSdk
+
+ defaultConfig {
+ minSdk = AndroidConfig.minSdk
+ targetSdk = AndroidConfig.targetSdk
+ }
+}
+
+repositories {
+ mavenCentral()
+}
+
+dependencies {
+ compileOnly(libs.kotlin.stdlib)
+ compileOnly(libs.okhttp)
+ compileOnly(libs.aniyomi.lib)
+}
+// BUMPS: 0
\ No newline at end of file
diff --git a/lib/dood-extractor/src/main/AndroidManifest.xml b/lib/dood-extractor/src/main/AndroidManifest.xml
new file mode 100644
index 000000000..fd4aec6b0
--- /dev/null
+++ b/lib/dood-extractor/src/main/AndroidManifest.xml
@@ -0,0 +1,2 @@
+
diff --git a/src/es/animelatinohd/src/eu/kanade/tachiyomi/animeextension/es/animelatinohd/extractors/DoodExtractor.kt b/lib/dood-extractor/src/main/java/eu/kanade/tachiyomi/lib/doodextractor/DoodExtractor.kt
similarity index 62%
rename from src/es/animelatinohd/src/eu/kanade/tachiyomi/animeextension/es/animelatinohd/extractors/DoodExtractor.kt
rename to lib/dood-extractor/src/main/java/eu/kanade/tachiyomi/lib/doodextractor/DoodExtractor.kt
index 66a832901..6c4ca1223 100644
--- a/src/es/animelatinohd/src/eu/kanade/tachiyomi/animeextension/es/animelatinohd/extractors/DoodExtractor.kt
+++ b/lib/dood-extractor/src/main/java/eu/kanade/tachiyomi/lib/doodextractor/DoodExtractor.kt
@@ -1,4 +1,4 @@
-package eu.kanade.tachiyomi.animeextension.es.animelatinohd.extractors
+package eu.kanade.tachiyomi.lib.doodextractor
import eu.kanade.tachiyomi.animesource.model.Video
import eu.kanade.tachiyomi.network.GET
@@ -6,10 +6,19 @@ import okhttp3.Headers
import okhttp3.OkHttpClient
class DoodExtractor(private val client: OkHttpClient) {
- fun videoFromUrl(url: String, quality: String): Video? {
+
+ fun videoFromUrl(
+ url: String,
+ quality: String? = null,
+ redirect: Boolean = true
+ ): Video? {
+ val newQuality = quality ?: "Doodstream" + if(redirect) " mirror" else ""
+
return try {
val response = client.newCall(GET(url)).execute()
- val doodTld = url.substringAfter("https://dood.").substringBefore("/")
+ val newUrl = if(redirect) response.request.url.toString() else url
+
+ val doodTld = newUrl.substringAfter("https://dood.").substringBefore("/")
val content = response.body!!.string()
if (!content.contains("'/pass_md5/")) return null
val md5 = content.substringAfter("'/pass_md5/").substringBefore("',")
@@ -19,16 +28,25 @@ class DoodExtractor(private val client: OkHttpClient) {
val videoUrlStart = client.newCall(
GET(
"https://dood.$doodTld/pass_md5/$md5",
- Headers.headersOf("referer", url)
+ Headers.headersOf("referer", newUrl)
)
).execute().body!!.string()
val videoUrl = "$videoUrlStart$randomString?token=$token&expiry=$expiry"
- Video(url, quality, videoUrl, headers = doodHeaders(doodTld))
+ Video(newUrl, newQuality, videoUrl, headers = doodHeaders(doodTld))
} catch (e: Exception) {
null
}
}
+ fun videosFromUrl(
+ url: String,
+ quality: String? = null,
+ redirect: Boolean = true
+ ): List