Add support to shared extractors (#917)

Co-authored-by: github-actions[bot] <github-actions[bot]@users.noreply.github.com>
This commit is contained in:
Claudemirovsky 2022-10-11 06:03:49 -03:00 committed by GitHub
parent 411d137324
commit 05088707a0
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
92 changed files with 291 additions and 1280 deletions

49
.github/scripts/bump-versions.sh vendored Executable file
View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -0,0 +1,2 @@
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="eu.kanade.tachiyomi.lib.doodextractor" />

View File

@ -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<Video> {
val video = videoFromUrl(url, quality, redirect)
return video?.let { listOf(it) } ?: emptyList<Video>()
}
private fun getRandomString(length: Int = 10): String {
val allowedChars = ('A'..'Z') + ('a'..'z') + ('0'..'9')
return (1..length)

View File

@ -1,7 +1,9 @@
include(":core")
include(":lib-dataimage")
project(":lib-dataimage").projectDir = File("lib/dataimage")
listOf("dataimage", "dood-extractor").forEach {
include(":lib-$it")
project(":lib-$it").projectDir = File("lib/$it")
}
if (System.getenv("CI") == null || System.getenv("CI_MODULE_GEN") == "true") {
// Local development (full project build)

View File

@ -5,8 +5,12 @@ ext {
extName = 'AnimeLek'
pkgNameSuffix = 'ar.animelek'
extClass = '.AnimeLek'
extVersionCode = 10
extVersionCode = 11
libVersion = '13'
}
dependencies {
implementation(project(':lib-dood-extractor'))
}
apply from: "$rootDir/common.gradle"

View File

@ -4,7 +4,7 @@ import android.app.Application
import android.content.SharedPreferences
import androidx.preference.ListPreference
import androidx.preference.PreferenceScreen
import eu.kanade.tachiyomi.animeextension.ar.animelek.extractors.DoodExtractor
import eu.kanade.tachiyomi.lib.doodextractor.DoodExtractor
import eu.kanade.tachiyomi.animeextension.ar.animelek.extractors.OkruExtractor
import eu.kanade.tachiyomi.animeextension.ar.animelek.extractors.SharedExtractor
import eu.kanade.tachiyomi.animeextension.ar.animelek.extractors.StreamSBExtractor

View File

@ -1,43 +0,0 @@
package eu.kanade.tachiyomi.animeextension.ar.animelek.extractors
import eu.kanade.tachiyomi.animesource.model.Video
import eu.kanade.tachiyomi.network.GET
import okhttp3.Headers
import okhttp3.OkHttpClient
class DoodExtractor(private val client: OkHttpClient) {
fun videoFromUrl(url: String, quality: String): Video? {
val response = client.newCall(GET(url)).execute()
// Overwrite url to the redirected one
val url = response.request.url.toString()
val doodTld = url.substringAfter("https://dood.").substringBefore("/")
val content = response.body!!.string()
// if (!content.contains("'/pass_md5/")) return null
val md5 = content.substringAfter("'/pass_md5/").substringBefore("',")
val token = md5.substringAfterLast("/")
val randomString = getRandomString()
val expiry = System.currentTimeMillis()
val videoUrlStart = client.newCall(
GET(
"https://dood.$doodTld/pass_md5/$md5",
Headers.headersOf("referer", url)
)
).execute().body!!.string()
val videoUrl = "$videoUrlStart$randomString?token=$token&expiry=$expiry"
// val newQuality = "Doodstream mirror"
return Video(url, quality, videoUrl, headers = doodHeaders(doodTld))
}
private fun getRandomString(length: Int = 10): String {
val allowedChars = ('A'..'Z') + ('a'..'z') + ('0'..'9')
return (1..length)
.map { allowedChars.random() }
.joinToString("")
}
private fun doodHeaders(tld: String) = Headers.Builder().apply {
add("User-Agent", "Aniyomi")
add("Referer", "https://dood.$tld/")
}.build()
}

View File

@ -5,8 +5,12 @@ ext {
extName = 'Animerco'
pkgNameSuffix = 'ar.animerco'
extClass = '.Animerco'
extVersionCode = 12
extVersionCode = 13
libVersion = '13'
}
dependencies {
implementation(project(':lib-dood-extractor'))
}
apply from: "$rootDir/common.gradle"

View File

@ -4,7 +4,7 @@ import android.app.Application
import android.content.SharedPreferences
import androidx.preference.ListPreference
import androidx.preference.PreferenceScreen
import eu.kanade.tachiyomi.animeextension.ar.animerco.extractors.DoodExtractor
import eu.kanade.tachiyomi.lib.doodextractor.DoodExtractor
import eu.kanade.tachiyomi.animeextension.ar.animerco.extractors.FembedExtractor
import eu.kanade.tachiyomi.animeextension.ar.animerco.extractors.MpforuploadExtractor
import eu.kanade.tachiyomi.animeextension.ar.animerco.extractors.SharedExtractor

View File

@ -1,43 +0,0 @@
package eu.kanade.tachiyomi.animeextension.ar.animerco.extractors
import eu.kanade.tachiyomi.animesource.model.Video
import eu.kanade.tachiyomi.network.GET
import okhttp3.Headers
import okhttp3.OkHttpClient
class DoodExtractor(private val client: OkHttpClient) {
fun videoFromUrl(url: String): Video? {
val response = client.newCall(GET(url)).execute()
// Overwrite url to the redirected one
val url = response.request.url.toString()
val doodTld = url.substringAfter("https://dood.").substringBefore("/")
val content = response.body!!.string()
if (!content.contains("'/pass_md5/")) return null
val md5 = content.substringAfter("'/pass_md5/").substringBefore("',")
val token = md5.substringAfterLast("/")
val randomString = getRandomString()
val expiry = System.currentTimeMillis()
val videoUrlStart = client.newCall(
GET(
"https://dood.$doodTld/pass_md5/$md5",
Headers.headersOf("referer", url)
)
).execute().body!!.string()
val videoUrl = "$videoUrlStart$randomString?token=$token&expiry=$expiry"
val newQuality = "Doodstream mirror"
return Video(url, newQuality, videoUrl, headers = doodHeaders(doodTld))
}
private fun getRandomString(length: Int = 10): String {
val allowedChars = ('A'..'Z') + ('a'..'z') + ('0'..'9')
return (1..length)
.map { allowedChars.random() }
.joinToString("")
}
private fun doodHeaders(tld: String) = Headers.Builder().apply {
add("User-Agent", "Aniyomi")
add("Referer", "https://dood.$tld/")
}.build()
}

View File

@ -5,8 +5,12 @@ ext {
extName = 'موفيزلاند'
pkgNameSuffix = 'ar.movizland'
extClass = '.Movizland'
extVersionCode = 4
extVersionCode = 5
libVersion = '13'
}
dependencies {
implementation(project(':lib-dood-extractor'))
}
apply from: "$rootDir/common.gradle"

View File

@ -4,7 +4,7 @@ import android.app.Application
import android.content.SharedPreferences
import androidx.preference.ListPreference
import androidx.preference.PreferenceScreen
import eu.kanade.tachiyomi.animeextension.ar.movizland.extractors.DoodExtractor
import eu.kanade.tachiyomi.lib.doodextractor.DoodExtractor
import eu.kanade.tachiyomi.animeextension.ar.movizland.extractors.LinkboxExtractor
import eu.kanade.tachiyomi.animeextension.ar.movizland.extractors.MoshahdaExtractor
import eu.kanade.tachiyomi.animeextension.ar.movizland.extractors.StreamTapeExtractor

View File

@ -1,43 +0,0 @@
package eu.kanade.tachiyomi.animeextension.ar.movizland.extractors
import eu.kanade.tachiyomi.animesource.model.Video
import eu.kanade.tachiyomi.network.GET
import okhttp3.Headers
import okhttp3.OkHttpClient
class DoodExtractor(private val client: OkHttpClient) {
fun videoFromUrl(url: String): Video? {
val response = client.newCall(GET(url)).execute()
// Overwrite url to the redirected one
val url = response.request.url.toString()
val doodTld = url.substringAfter("https://dood.").substringBefore("/")
val content = response.body!!.string()
if (!content.contains("'/pass_md5/")) return null
val md5 = content.substringAfter("'/pass_md5/").substringBefore("',")
val token = md5.substringAfterLast("/")
val randomString = getRandomString()
val expiry = System.currentTimeMillis()
val videoUrlStart = client.newCall(
GET(
"https://dood.$doodTld/pass_md5/$md5",
Headers.headersOf("referer", url)
)
).execute().body!!.string()
val videoUrl = "$videoUrlStart$randomString?token=$token&expiry=$expiry"
val newQuality = "Doodstream: 1080p"
return Video(url, newQuality, videoUrl, headers = doodHeaders(doodTld))
}
private fun getRandomString(length: Int = 10): String {
val allowedChars = ('A'..'Z') + ('a'..'z') + ('0'..'9')
return (1..length)
.map { allowedChars.random() }
.joinToString("")
}
private fun doodHeaders(tld: String) = Headers.Builder().apply {
add("User-Agent", "Aniyomi")
add("Referer", "https://dood.$tld/")
}.build()
}

View File

@ -5,8 +5,12 @@ ext {
extName = 'شاهد فور يو'
pkgNameSuffix = 'ar.shahid4u'
extClass = '.Shahid4U'
extVersionCode = 4
extVersionCode = 5
libVersion = '13'
}
dependencies {
implementation(project(':lib-dood-extractor'))
}
apply from: "$rootDir/common.gradle"

View File

@ -4,7 +4,7 @@ import android.app.Application
import android.content.SharedPreferences
import androidx.preference.ListPreference
import androidx.preference.PreferenceScreen
import eu.kanade.tachiyomi.animeextension.ar.shahid4u.extractors.DoodExtractor
import eu.kanade.tachiyomi.lib.doodextractor.DoodExtractor
import eu.kanade.tachiyomi.animeextension.ar.shahid4u.extractors.OkruExtractor
import eu.kanade.tachiyomi.animeextension.ar.shahid4u.extractors.UQLoadExtractor
import eu.kanade.tachiyomi.animeextension.ar.shahid4u.extractors.VidBomExtractor

View File

@ -1,43 +0,0 @@
package eu.kanade.tachiyomi.animeextension.ar.shahid4u.extractors
import eu.kanade.tachiyomi.animesource.model.Video
import eu.kanade.tachiyomi.network.GET
import okhttp3.Headers
import okhttp3.OkHttpClient
class DoodExtractor(private val client: OkHttpClient) {
fun videoFromUrl(url: String): Video? {
val response = client.newCall(GET(url)).execute()
// Overwrite url to the redirected one
val url = response.request.url.toString()
val doodTld = url.substringAfter("https://dood.").substringBefore("/")
val content = response.body!!.string()
if (!content.contains("'/pass_md5/")) return null
val md5 = content.substringAfter("'/pass_md5/").substringBefore("',")
val token = md5.substringAfterLast("/")
val randomString = getRandomString()
val expiry = System.currentTimeMillis()
val videoUrlStart = client.newCall(
GET(
"https://dood.$doodTld/pass_md5/$md5",
Headers.headersOf("referer", url)
)
).execute().body!!.string()
val videoUrl = "$videoUrlStart$randomString?token=$token&expiry=$expiry"
val newQuality = "Doodstream: 1080p"
return Video(url, newQuality, videoUrl, headers = doodHeaders(doodTld))
}
private fun getRandomString(length: Int = 10): String {
val allowedChars = ('A'..'Z') + ('a'..'z') + ('0'..'9')
return (1..length)
.map { allowedChars.random() }
.joinToString("")
}
private fun doodHeaders(tld: String) = Headers.Builder().apply {
add("User-Agent", "Aniyomi")
add("Referer", "https://dood.$tld/")
}.build()
}

View File

@ -5,8 +5,12 @@ ext {
extName = 'WIT ANIME'
pkgNameSuffix = 'ar.witanime'
extClass = '.WitAnime'
extVersionCode = 20
extVersionCode = 21
libVersion = '13'
}
dependencies {
implementation(project(':lib-dood-extractor'))
}
apply from: "$rootDir/common.gradle"

View File

@ -4,7 +4,7 @@ import android.app.Application
import android.content.SharedPreferences
import androidx.preference.ListPreference
import androidx.preference.PreferenceScreen
import eu.kanade.tachiyomi.animeextension.ar.witanime.extractors.DoodExtractor
import eu.kanade.tachiyomi.lib.doodextractor.DoodExtractor
import eu.kanade.tachiyomi.animeextension.ar.witanime.extractors.FembedExtractor
import eu.kanade.tachiyomi.animeextension.ar.witanime.extractors.SoraPlayExtractor
import eu.kanade.tachiyomi.animeextension.ar.witanime.extractors.StreamSBExtractor

View File

@ -1,43 +0,0 @@
package eu.kanade.tachiyomi.animeextension.ar.witanime.extractors
import eu.kanade.tachiyomi.animesource.model.Video
import eu.kanade.tachiyomi.network.GET
import okhttp3.Headers
import okhttp3.OkHttpClient
class DoodExtractor(private val client: OkHttpClient) {
fun videoFromUrl(url: String, quality: String): Video? {
val response = client.newCall(GET(url)).execute()
// Overwrite url to the redirected one
val url = response.request.url.toString()
val doodTld = url.substringAfter("https://dood.").substringBefore("/")
val content = response.body!!.string()
if (!content.contains("'/pass_md5/")) return null
val md5 = content.substringAfter("'/pass_md5/").substringBefore("',")
val token = md5.substringAfterLast("/")
val randomString = getRandomString()
val expiry = System.currentTimeMillis()
val videoUrlStart = client.newCall(
GET(
"https://dood.$doodTld/pass_md5/$md5",
Headers.headersOf("referer", url)
)
).execute().body!!.string()
val videoUrl = "$videoUrlStart$randomString?token=$token&expiry=$expiry"
// val newQuality = "Doodstream mirror"
return Video(url, quality, videoUrl, headers = doodHeaders(doodTld))
}
private fun getRandomString(length: Int = 10): String {
val allowedChars = ('A'..'Z') + ('a'..'z') + ('0'..'9')
return (1..length)
.map { allowedChars.random() }
.joinToString("")
}
private fun doodHeaders(tld: String) = Headers.Builder().apply {
add("User-Agent", "Aniyomi")
add("Referer", "https://dood.$tld/")
}.build()
}

View File

@ -6,8 +6,12 @@ ext {
extName = 'Aniflix'
pkgNameSuffix = 'de.aniflix'
extClass = '.Aniflix'
extVersionCode = 17
extVersionCode = 18
libVersion = '13'
}
dependencies {
implementation(project(':lib-dood-extractor'))
}
apply from: "$rootDir/common.gradle"

View File

@ -10,7 +10,7 @@ import eu.kanade.tachiyomi.animeextension.de.aniflix.dto.AnimeDto
import eu.kanade.tachiyomi.animeextension.de.aniflix.dto.Episode
import eu.kanade.tachiyomi.animeextension.de.aniflix.dto.Release
import eu.kanade.tachiyomi.animeextension.de.aniflix.dto.Season
import eu.kanade.tachiyomi.animeextension.de.aniflix.extractors.DoodExtractor
import eu.kanade.tachiyomi.lib.doodextractor.DoodExtractor
import eu.kanade.tachiyomi.animeextension.de.aniflix.extractors.StreamTapeExtractor
import eu.kanade.tachiyomi.animeextension.de.aniflix.extractors.StreamlareExtractor
import eu.kanade.tachiyomi.animeextension.de.aniflix.extractors.VoeExtractor
@ -198,7 +198,7 @@ class Aniflix : ConfigurableAnimeSource, AnimeHttpSource() {
val hosterSelection = preferences.getStringSet("hoster_selection", setOf("dood", "stape", "voe", "slare"))
when {
link.contains("https://dood") && hosterSelection?.contains("dood") == true -> {
val video = try { DoodExtractor(client).videoFromUrl(link, quality) } catch (e: Exception) { null }
val video = try { DoodExtractor(client).videoFromUrl(link, quality, false) } catch (e: Exception) { null }
if (video != null) {
videoList.add(video)
}

View File

@ -1,40 +0,0 @@
package eu.kanade.tachiyomi.animeextension.de.aniflix.extractors
import eu.kanade.tachiyomi.animesource.model.Video
import eu.kanade.tachiyomi.network.GET
import okhttp3.Headers
import okhttp3.OkHttpClient
class DoodExtractor(private val client: OkHttpClient) {
fun videoFromUrl(url: String, quality: String): Video? {
val response = client.newCall(GET(url)).execute()
val doodTld = url.substringAfter("https://dood.").substringBefore("/")
val content = response.body!!.string()
if (!content.contains("'/pass_md5/")) return null
val md5 = content.substringAfter("'/pass_md5/").substringBefore("',")
val token = md5.substringAfterLast("/")
val randomString = getRandomString()
val expiry = System.currentTimeMillis()
val videoUrlStart = client.newCall(
GET(
"https://dood.$doodTld/pass_md5/$md5",
Headers.headersOf("referer", url)
)
).execute().body!!.string()
val videoUrl = "$videoUrlStart$randomString?token=$token&expiry=$expiry"
return Video(url, quality, videoUrl, headers = doodHeaders(doodTld))
}
private fun getRandomString(length: Int = 10): String {
val allowedChars = ('A'..'Z') + ('a'..'z') + ('0'..'9')
return (1..length)
.map { allowedChars.random() }
.joinToString("")
}
private fun doodHeaders(tld: String) = Headers.Builder().apply {
add("User-Agent", "Aniyomi")
add("Referer", "https://dood.$tld/")
}.build()
}

View File

@ -6,8 +6,12 @@ ext {
extName = 'Anime Shitai'
pkgNameSuffix = 'de.animeshitai'
extClass = '.AnimeShitai'
extVersionCode = 4
extVersionCode = 5
libVersion = '13'
}
dependencies {
implementation(project(':lib-dood-extractor'))
}
apply from: "$rootDir/common.gradle"

View File

@ -7,7 +7,7 @@ import androidx.preference.ListPreference
import androidx.preference.MultiSelectListPreference
import androidx.preference.PreferenceScreen
import eu.kanade.tachiyomi.animeextension.de.animeshitai.ASFilters.applyFilterParams
import eu.kanade.tachiyomi.animeextension.de.animeshitai.extractors.DoodExtractor
import eu.kanade.tachiyomi.lib.doodextractor.DoodExtractor
import eu.kanade.tachiyomi.animeextension.de.animeshitai.extractors.StreamTapeExtractor
import eu.kanade.tachiyomi.animeextension.de.animeshitai.model.ASAnime
import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource

View File

@ -1,42 +0,0 @@
package eu.kanade.tachiyomi.animeextension.de.animeshitai.extractors
import eu.kanade.tachiyomi.animesource.model.Video
import eu.kanade.tachiyomi.network.GET
import okhttp3.Headers
import okhttp3.OkHttpClient
class DoodExtractor(private val client: OkHttpClient) {
fun videoFromUrl(url: String, quality: String): Video? {
val response = client.newCall(GET(url)).execute()
// Overwrite url to the redirected one
val url = response.request.url.toString()
val doodTld = url.substringAfter("https://dood.").substringBefore("/")
val content = response.body!!.string()
if (!content.contains("'/pass_md5/")) return null
val md5 = content.substringAfter("'/pass_md5/").substringBefore("',")
val token = md5.substringAfterLast("/")
val randomString = getRandomString()
val expiry = System.currentTimeMillis()
val videoUrlStart = client.newCall(
GET(
"https://dood.$doodTld/pass_md5/$md5",
Headers.headersOf("referer", url)
)
).execute().body!!.string()
val videoUrl = "$videoUrlStart$randomString?token=$token&expiry=$expiry"
return Video(url, quality, videoUrl, headers = doodHeaders(doodTld))
}
private fun getRandomString(length: Int = 10): String {
val allowedChars = ('A'..'Z') + ('a'..'z') + ('0'..'9')
return (1..length)
.map { allowedChars.random() }
.joinToString("")
}
private fun doodHeaders(tld: String) = Headers.Builder().apply {
add("User-Agent", "Aniyomi")
add("Referer", "https://dood.$tld/")
}.build()
}

View File

@ -6,8 +6,12 @@ ext {
extName = 'AnimeToast'
pkgNameSuffix = 'de.animetoast'
extClass = '.AnimeToast'
extVersionCode = 1
extVersionCode = 2
libVersion = '13'
}
dependencies {
implementation(project(':lib-dood-extractor'))
}
apply from: "$rootDir/common.gradle"

View File

@ -5,7 +5,7 @@ import android.content.SharedPreferences
import androidx.preference.ListPreference
import androidx.preference.MultiSelectListPreference
import androidx.preference.PreferenceScreen
import eu.kanade.tachiyomi.animeextension.de.animetoast.extractors.DoodExtractor
import eu.kanade.tachiyomi.lib.doodextractor.DoodExtractor
import eu.kanade.tachiyomi.animeextension.de.animetoast.extractors.VoeExtractor
import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource
import eu.kanade.tachiyomi.animesource.model.AnimeFilterList
@ -126,7 +126,7 @@ class AnimeToast : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
when {
link.contains("https://dood") && hosterSelection?.contains("dood") == true -> {
val quality = "DoodStream"
val video = DoodExtractor(client).videoFromUrl(link, quality)
val video = DoodExtractor(client).videoFromUrl(link, quality, false)
if (video != null) {
videoList.add(video)
}

View File

@ -1,40 +0,0 @@
package eu.kanade.tachiyomi.animeextension.de.animetoast.extractors
import eu.kanade.tachiyomi.animesource.model.Video
import eu.kanade.tachiyomi.network.GET
import okhttp3.Headers
import okhttp3.OkHttpClient
class DoodExtractor(private val client: OkHttpClient) {
fun videoFromUrl(url: String, quality: String): Video? {
val response = client.newCall(GET(url)).execute()
val doodTld = url.substringAfter("https://dood.").substringBefore("/")
val content = response.body!!.string()
if (!content.contains("'/pass_md5/")) return null
val md5 = content.substringAfter("'/pass_md5/").substringBefore("',")
val token = md5.substringAfterLast("/")
val randomString = getRandomString()
val expiry = System.currentTimeMillis()
val videoUrlStart = client.newCall(
GET(
"https://dood.$doodTld/pass_md5/$md5",
Headers.headersOf("referer", url)
)
).execute().body!!.string()
val videoUrl = "$videoUrlStart$randomString?token=$token&expiry=$expiry"
return Video(url, quality, videoUrl, null, doodHeaders(doodTld))
}
private fun getRandomString(length: Int = 10): String {
val allowedChars = ('A'..'Z') + ('a'..'z') + ('0'..'9')
return (1..length)
.map { allowedChars.random() }
.joinToString("")
}
private fun doodHeaders(tld: String) = Headers.Builder().apply {
add("User-Agent", "Aniyomi")
add("Referer", "https://dood.$tld/")
}.build()
}

View File

@ -6,8 +6,12 @@ ext {
extName = 'AniWorld (experimental)'
pkgNameSuffix = 'de.aniworld'
extClass = '.AniWorld'
extVersionCode = 6
extVersionCode = 7
libVersion = '13'
}
dependencies {
implementation(project(':lib-dood-extractor'))
}
apply from: "$rootDir/common.gradle"

View File

@ -9,7 +9,7 @@ import androidx.preference.EditTextPreference
import androidx.preference.ListPreference
import androidx.preference.MultiSelectListPreference
import androidx.preference.PreferenceScreen
import eu.kanade.tachiyomi.animeextension.de.aniworld.extractors.DoodExtractor
import eu.kanade.tachiyomi.lib.doodextractor.DoodExtractor
import eu.kanade.tachiyomi.animeextension.de.aniworld.extractors.StreamTapeExtractor
import eu.kanade.tachiyomi.animeextension.de.aniworld.extractors.VidozaExtractor
import eu.kanade.tachiyomi.animeextension.de.aniworld.extractors.VoeExtractor

View File

@ -1,42 +0,0 @@
package eu.kanade.tachiyomi.animeextension.de.aniworld.extractors
import eu.kanade.tachiyomi.animesource.model.Video
import eu.kanade.tachiyomi.network.GET
import okhttp3.Headers
import okhttp3.OkHttpClient
class DoodExtractor(private val client: OkHttpClient) {
fun videoFromUrl(url: String, quality: String): Video? {
val response = client.newCall(GET(url)).execute()
// Overwrite url to the redirected one
val url = response.request.url.toString()
val doodTld = url.substringAfter("https://dood.").substringBefore("/")
val content = response.body!!.string()
if (!content.contains("'/pass_md5/")) return null
val md5 = content.substringAfter("'/pass_md5/").substringBefore("',")
val token = md5.substringAfterLast("/")
val randomString = getRandomString()
val expiry = System.currentTimeMillis()
val videoUrlStart = client.newCall(
GET(
"https://dood.$doodTld/pass_md5/$md5",
Headers.headersOf("referer", url)
)
).execute().body!!.string()
val videoUrl = "$videoUrlStart$randomString?token=$token&expiry=$expiry"
return Video(url, quality, videoUrl, headers = doodHeaders(doodTld))
}
private fun getRandomString(length: Int = 10): String {
val allowedChars = ('A'..'Z') + ('a'..'z') + ('0'..'9')
return (1..length)
.map { allowedChars.random() }
.joinToString("")
}
private fun doodHeaders(tld: String) = Headers.Builder().apply {
add("User-Agent", "Aniyomi")
add("Referer", "https://dood.$tld/")
}.build()
}

View File

@ -6,9 +6,13 @@ ext {
extName = 'FireAnime'
pkgNameSuffix = 'de.fireanime'
extClass = '.FireAnime'
extVersionCode = 5
extVersionCode = 6
libVersion = '13'
containsNsfw = true
}
dependencies {
implementation(project(':lib-dood-extractor'))
}
apply from: "$rootDir/common.gradle"

View File

@ -14,7 +14,7 @@ import eu.kanade.tachiyomi.animeextension.de.fireanime.dto.EpisodeListingWrapper
import eu.kanade.tachiyomi.animeextension.de.fireanime.dto.EpisodeSourcesDto
import eu.kanade.tachiyomi.animeextension.de.fireanime.dto.HosterSourceDto
import eu.kanade.tachiyomi.animeextension.de.fireanime.dto.VideoLinkDto
import eu.kanade.tachiyomi.animeextension.de.fireanime.extractors.DoodExtractor
import eu.kanade.tachiyomi.lib.doodextractor.DoodExtractor
import eu.kanade.tachiyomi.animeextension.de.fireanime.extractors.FireCdnExtractor
import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource
import eu.kanade.tachiyomi.animesource.model.AnimeFilterList
@ -214,7 +214,7 @@ class FireAnime : ConfigurableAnimeSource, AnimeHttpSource() {
}
isSource(FAConstants.NAME_DOOD) -> {
val video = try {
DoodExtractor(client).videoFromUrl(link, quality)
DoodExtractor(client).videoFromUrl(link, quality, false)
} catch (e: Exception) {
null
}

View File

@ -1,40 +0,0 @@
package eu.kanade.tachiyomi.animeextension.de.fireanime.extractors
import eu.kanade.tachiyomi.animesource.model.Video
import eu.kanade.tachiyomi.network.GET
import okhttp3.Headers
import okhttp3.OkHttpClient
class DoodExtractor(private val client: OkHttpClient) {
fun videoFromUrl(url: String, quality: String): Video? {
val response = client.newCall(GET(url)).execute()
val doodTld = url.substringAfter("https://dood.").substringBefore("/")
val content = response.body!!.string()
if (!content.contains("'/pass_md5/")) return null
val md5 = content.substringAfter("'/pass_md5/").substringBefore("',")
val token = md5.substringAfterLast("/")
val randomString = getRandomString()
val expiry = System.currentTimeMillis()
val videoUrlStart = client.newCall(
GET(
"https://dood.$doodTld/pass_md5/$md5",
Headers.headersOf("referer", url)
)
).execute().body!!.string()
val videoUrl = "$videoUrlStart$randomString?token=$token&expiry=$expiry"
return Video(url, quality, videoUrl, headers = doodHeaders(doodTld))
}
private fun getRandomString(length: Int = 10): String {
val allowedChars = ('A'..'Z') + ('a'..'z') + ('0'..'9')
return (1..length)
.map { allowedChars.random() }
.joinToString("")
}
private fun doodHeaders(tld: String) = Headers.Builder().apply {
add("User-Agent", "Aniyomi")
add("Referer", "https://dood.$tld/")
}.build()
}

View File

@ -6,8 +6,12 @@ ext {
extName = 'Kinoking'
pkgNameSuffix = 'de.kinoking'
extClass = '.Kinoking'
extVersionCode = 3
extVersionCode = 4
libVersion = '13'
}
dependencies {
implementation(project(':lib-dood-extractor'))
}
apply from: "$rootDir/common.gradle"

View File

@ -5,7 +5,7 @@ import android.content.SharedPreferences
import androidx.preference.ListPreference
import androidx.preference.MultiSelectListPreference
import androidx.preference.PreferenceScreen
import eu.kanade.tachiyomi.animeextension.de.kinoking.extractors.DoodExtractor
import eu.kanade.tachiyomi.lib.doodextractor.DoodExtractor
import eu.kanade.tachiyomi.animeextension.de.kinoking.extractors.StreamSBExtractor
import eu.kanade.tachiyomi.animeextension.de.kinoking.extractors.VoeExtractor
import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource
@ -134,7 +134,8 @@ class Kinoking : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
}
link.contains("https://dood.") || link.contains("https://doodstream.") && hosterSelection?.contains("dood") == true -> {
val quality = "Doodstream"
val video = DoodExtractor(client).videoFromUrl(link, quality)
val redirect = !link.contains("https://doodstream")
val video = DoodExtractor(client).videoFromUrl(link, quality, redirect)
if (video != null) {
videoList.add(video)
}

View File

@ -1,61 +0,0 @@
package eu.kanade.tachiyomi.animeextension.de.kinoking.extractors
import eu.kanade.tachiyomi.animesource.model.Video
import eu.kanade.tachiyomi.network.GET
import okhttp3.Headers
import okhttp3.OkHttpClient
class DoodExtractor(private val client: OkHttpClient) {
fun videoFromUrl(url: String, quality: String): Video? {
if (url.contains("https://doodstream")) {
val newurl = client.newCall(GET(url)).execute().request.url.toString()
val response = client.newCall(GET(newurl)).execute()
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("',")
val token = md5.substringAfterLast("/")
val randomString = getRandomString()
val expiry = System.currentTimeMillis()
val videoUrlStart = client.newCall(
GET(
"https://dood.$doodTld/pass_md5/$md5",
Headers.headersOf("referer", newurl)
)
).execute().body!!.string()
val videoUrl = "$videoUrlStart$randomString?token=$token&expiry=$expiry"
return Video(url, quality, videoUrl, headers = doodHeaders(doodTld))
} else {
val response = client.newCall(GET(url)).execute()
val doodTld = url.substringAfter("https://dood.").substringBefore("/")
val content = response.body!!.string()
if (!content.contains("'/pass_md5/")) return null
val md5 = content.substringAfter("'/pass_md5/").substringBefore("',")
val token = md5.substringAfterLast("/")
val randomString = getRandomString()
val expiry = System.currentTimeMillis()
val videoUrlStart = client.newCall(
GET(
"https://dood.$doodTld/pass_md5/$md5",
Headers.headersOf("referer", url)
)
).execute().body!!.string()
val videoUrl = "$videoUrlStart$randomString?token=$token&expiry=$expiry"
return Video(url, quality, videoUrl, headers = doodHeaders(doodTld))
}
}
private fun getRandomString(length: Int = 10): String {
val allowedChars = ('A'..'Z') + ('a'..'z') + ('0'..'9')
return (1..length)
.map { allowedChars.random() }
.joinToString("")
}
private fun doodHeaders(tld: String) = Headers.Builder().apply {
add("User-Agent", "Aniyomi")
add("Referer", "https://dood.$tld/")
}.build()
}

View File

@ -6,8 +6,12 @@ ext {
extName = 'Serienstream'
pkgNameSuffix = 'de.serienstream'
extClass = '.Serienstream'
extVersionCode = 1
extVersionCode = 2
libVersion = '13'
}
dependencies {
implementation(project(':lib-dood-extractor'))
}
apply from: "$rootDir/common.gradle"

View File

@ -9,7 +9,7 @@ import androidx.preference.EditTextPreference
import androidx.preference.ListPreference
import androidx.preference.MultiSelectListPreference
import androidx.preference.PreferenceScreen
import eu.kanade.tachiyomi.animeextension.de.serienstream.extractors.DoodExtractor
import eu.kanade.tachiyomi.lib.doodextractor.DoodExtractor
import eu.kanade.tachiyomi.animeextension.de.serienstream.extractors.StreamTapeExtractor
import eu.kanade.tachiyomi.animeextension.de.serienstream.extractors.VoeExtractor
import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource

View File

@ -1,42 +0,0 @@
package eu.kanade.tachiyomi.animeextension.de.serienstream.extractors
import eu.kanade.tachiyomi.animesource.model.Video
import eu.kanade.tachiyomi.network.GET
import okhttp3.Headers
import okhttp3.OkHttpClient
class DoodExtractor(private val client: OkHttpClient) {
fun videoFromUrl(url: String, quality: String): Video? {
val response = client.newCall(GET(url)).execute()
// Overwrite url to the redirected one
val url = response.request.url.toString()
val doodTld = url.substringAfter("https://dood.").substringBefore("/")
val content = response.body!!.string()
if (!content.contains("'/pass_md5/")) return null
val md5 = content.substringAfter("'/pass_md5/").substringBefore("',")
val token = md5.substringAfterLast("/")
val randomString = getRandomString()
val expiry = System.currentTimeMillis()
val videoUrlStart = client.newCall(
GET(
"https://dood.$doodTld/pass_md5/$md5",
Headers.headersOf("referer", url)
)
).execute().body!!.string()
val videoUrl = "$videoUrlStart$randomString?token=$token&expiry=$expiry"
return Video(url, quality, videoUrl, headers = doodHeaders(doodTld))
}
private fun getRandomString(length: Int = 10): String {
val allowedChars = ('A'..'Z') + ('a'..'z') + ('0'..'9')
return (1..length)
.map { allowedChars.random() }
.joinToString("")
}
private fun doodHeaders(tld: String) = Headers.Builder().apply {
add("User-Agent", "Aniyomi")
add("Referer", "https://dood.$tld/")
}.build()
}

View File

@ -6,8 +6,12 @@ ext {
extName = 'StreamCloud'
pkgNameSuffix = 'de.streamcloud'
extClass = '.StreamCloud'
extVersionCode = 1
extVersionCode = 2
libVersion = '13'
}
dependencies {
implementation(project(':lib-dood-extractor'))
}
apply from: "$rootDir/common.gradle"

View File

@ -5,7 +5,7 @@ import android.content.SharedPreferences
import androidx.preference.ListPreference
import androidx.preference.MultiSelectListPreference
import androidx.preference.PreferenceScreen
import eu.kanade.tachiyomi.animeextension.de.streamcloud.extractors.DoodExtractor
import eu.kanade.tachiyomi.lib.doodextractor.DoodExtractor
import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource
import eu.kanade.tachiyomi.animesource.model.AnimeFilterList
import eu.kanade.tachiyomi.animesource.model.SAnime
@ -115,7 +115,7 @@ class StreamCloud : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
li.text().contains("doodstream.com") && hosterSelection?.contains("dood") == true -> {
val quality = "Doodstream"
val link = "https:" + li.attr("data-link")
val video = DoodExtractor(client).videoFromUrl(link, quality)
val video = DoodExtractor(client).videoFromUrl(link, quality, false)
if (video != null) {
videoList.add(video)
}

View File

@ -1,40 +0,0 @@
package eu.kanade.tachiyomi.animeextension.de.streamcloud.extractors
import eu.kanade.tachiyomi.animesource.model.Video
import eu.kanade.tachiyomi.network.GET
import okhttp3.Headers
import okhttp3.OkHttpClient
class DoodExtractor(private val client: OkHttpClient) {
fun videoFromUrl(url: String, quality: String): Video? {
val response = client.newCall(GET(url)).execute()
val doodTld = url.substringAfter("https://dood.").substringBefore("/")
val content = response.body!!.string()
if (!content.contains("'/pass_md5/")) return null
val md5 = content.substringAfter("'/pass_md5/").substringBefore("',")
val token = md5.substringAfterLast("/")
val randomString = getRandomString()
val expiry = System.currentTimeMillis()
val videoUrlStart = client.newCall(
GET(
"https://dood.$doodTld/pass_md5/$md5",
Headers.headersOf("referer", url)
)
).execute().body!!.string()
val videoUrl = "$videoUrlStart$randomString?token=$token&expiry=$expiry"
return Video(url, quality, videoUrl, headers = doodHeaders(doodTld))
}
private fun getRandomString(length: Int = 10): String {
val allowedChars = ('A'..'Z') + ('a'..'z') + ('0'..'9')
return (1..length)
.map { allowedChars.random() }
.joinToString("")
}
private fun doodHeaders(tld: String) = Headers.Builder().apply {
add("User-Agent", "Aniyomi")
add("Referer", "https://dood.$tld/")
}.build()
}

View File

@ -5,8 +5,12 @@ ext {
extName = 'Animension'
pkgNameSuffix = 'en.animension'
extClass = '.Animension'
extVersionCode = 4
extVersionCode = 5
libVersion = '13'
}
dependencies {
implementation(project(':lib-dood-extractor'))
}
apply from: "$rootDir/common.gradle"

View File

@ -4,7 +4,7 @@ import android.app.Application
import android.content.SharedPreferences
import androidx.preference.ListPreference
import androidx.preference.PreferenceScreen
import eu.kanade.tachiyomi.animeextension.en.animension.extractors.DoodExtractor
import eu.kanade.tachiyomi.lib.doodextractor.DoodExtractor
import eu.kanade.tachiyomi.animeextension.en.animension.extractors.FembedExtractor
import eu.kanade.tachiyomi.animeextension.en.animension.extractors.StreamSBExtractor
import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource

View File

@ -1,43 +0,0 @@
package eu.kanade.tachiyomi.animeextension.en.animension.extractors
import eu.kanade.tachiyomi.animesource.model.Video
import eu.kanade.tachiyomi.network.GET
import okhttp3.Headers
import okhttp3.OkHttpClient
class DoodExtractor(private val client: OkHttpClient) {
fun videoFromUrl(url: String): Video? {
val response = client.newCall(GET(url)).execute()
// Overwrite url to the redirected one
val url = response.request.url.toString()
val doodTld = url.substringAfter("https://dood.").substringBefore("/")
val content = response.body!!.string()
if (!content.contains("'/pass_md5/")) return null
val md5 = content.substringAfter("'/pass_md5/").substringBefore("',")
val token = md5.substringAfterLast("/")
val randomString = getRandomString()
val expiry = System.currentTimeMillis()
val videoUrlStart = client.newCall(
GET(
"https://dood.$doodTld/pass_md5/$md5",
Headers.headersOf("referer", url)
)
).execute().body!!.string()
val videoUrl = "$videoUrlStart$randomString?token=$token&expiry=$expiry"
val newQuality = "Doodstream mirror"
return Video(url, newQuality, videoUrl, headers = doodHeaders(doodTld))
}
private fun getRandomString(length: Int = 10): String {
val allowedChars = ('A'..'Z') + ('a'..'z') + ('0'..'9')
return (1..length)
.map { allowedChars.random() }
.joinToString("")
}
private fun doodHeaders(tld: String) = Headers.Builder().apply {
add("User-Agent", "Aniyomi")
add("Referer", "https://dood.$tld/")
}.build()
}

View File

@ -5,8 +5,12 @@ ext {
extName = 'AsianLoad'
pkgNameSuffix = 'en.asianload'
extClass = '.AsianLoad'
extVersionCode = 16
extVersionCode = 17
libVersion = '13'
}
dependencies {
implementation(project(':lib-dood-extractor'))
}
apply from: "$rootDir/common.gradle"

View File

@ -4,7 +4,7 @@ import android.app.Application
import android.content.SharedPreferences
import androidx.preference.ListPreference
import androidx.preference.PreferenceScreen
import eu.kanade.tachiyomi.animeextension.en.asianload.extractors.DoodExtractor
import eu.kanade.tachiyomi.lib.doodextractor.DoodExtractor
import eu.kanade.tachiyomi.animeextension.en.asianload.extractors.FembedExtractor
import eu.kanade.tachiyomi.animeextension.en.asianload.extractors.StreamSBExtractor
import eu.kanade.tachiyomi.animeextension.en.asianload.extractors.StreamTapeExtractor

View File

@ -1,43 +0,0 @@
package eu.kanade.tachiyomi.animeextension.en.asianload.extractors
import eu.kanade.tachiyomi.animesource.model.Video
import eu.kanade.tachiyomi.network.GET
import okhttp3.Headers
import okhttp3.OkHttpClient
class DoodExtractor(private val client: OkHttpClient) {
fun videoFromUrl(url: String): Video? {
val response = client.newCall(GET(url)).execute()
// Overwrite url to the redirected one
val url = response.request.url.toString()
val doodTld = url.substringAfter("https://dood.").substringBefore("/")
val content = response.body!!.string()
if (!content.contains("'/pass_md5/")) return null
val md5 = content.substringAfter("'/pass_md5/").substringBefore("',")
val token = md5.substringAfterLast("/")
val randomString = getRandomString()
val expiry = System.currentTimeMillis()
val videoUrlStart = client.newCall(
GET(
"https://dood.$doodTld/pass_md5/$md5",
Headers.headersOf("referer", url)
)
).execute().body!!.string()
val videoUrl = "$videoUrlStart$randomString?token=$token&expiry=$expiry"
val newQuality = "Doodstream mirror"
return Video(url, newQuality, videoUrl, headers = doodHeaders(doodTld))
}
private fun getRandomString(length: Int = 10): String {
val allowedChars = ('A'..'Z') + ('a'..'z') + ('0'..'9')
return (1..length)
.map { allowedChars.random() }
.joinToString("")
}
private fun doodHeaders(tld: String) = Headers.Builder().apply {
add("User-Agent", "Aniyomi")
add("Referer", "https://dood.$tld/")
}.build()
}

View File

@ -5,12 +5,13 @@ ext {
extName = 'DopeBox'
pkgNameSuffix = 'en.dopebox'
extClass = '.DopeBox'
extVersionCode = 11
extVersionCode = 12
libVersion = '13'
}
dependencies {
compileOnly libs.bundles.coroutines
implementation(project(':lib-dood-extractor'))
}
apply from: "$rootDir/common.gradle"

View File

@ -4,7 +4,7 @@ import android.app.Application
import android.content.SharedPreferences
import androidx.preference.ListPreference
import androidx.preference.PreferenceScreen
import eu.kanade.tachiyomi.animeextension.en.dopebox.extractors.DoodExtractor
import eu.kanade.tachiyomi.lib.doodextractor.DoodExtractor
import eu.kanade.tachiyomi.animeextension.en.dopebox.extractors.DopeBoxExtractor
import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource
import eu.kanade.tachiyomi.animesource.model.AnimeFilterList

View File

@ -1,43 +0,0 @@
package eu.kanade.tachiyomi.animeextension.en.dopebox.extractors
import eu.kanade.tachiyomi.animesource.model.Video
import eu.kanade.tachiyomi.network.GET
import okhttp3.Headers
import okhttp3.OkHttpClient
class DoodExtractor(private val client: OkHttpClient) {
fun videoFromUrl(url: String): Video? {
val response = client.newCall(GET(url)).execute()
// Overwrite url to the redirected one
val url = response.request.url.toString()
val doodTld = url.substringAfter("https://dood.").substringBefore("/")
val content = response.body!!.string()
if (!content.contains("'/pass_md5/")) return null
val md5 = content.substringAfter("'/pass_md5/").substringBefore("',")
val token = md5.substringAfterLast("/")
val randomString = getRandomString()
val expiry = System.currentTimeMillis()
val videoUrlStart = client.newCall(
GET(
"https://dood.$doodTld/pass_md5/$md5",
Headers.headersOf("referer", url)
)
).execute().body!!.string()
val videoUrl = "$videoUrlStart$randomString?token=$token&expiry=$expiry"
val newQuality = "DoodStream mirror"
return Video(url, newQuality, videoUrl, headers = doodHeaders(doodTld))
}
private fun getRandomString(length: Int = 10): String {
val allowedChars = ('A'..'Z') + ('a'..'z') + ('0'..'9')
return (1..length)
.map { allowedChars.random() }
.joinToString("")
}
private fun doodHeaders(tld: String) = Headers.Builder().apply {
add("User-Agent", "Aniyomi")
add("Referer", "https://dood.$tld/")
}.build()
}

View File

@ -5,8 +5,12 @@ ext {
extName = 'DramaCool'
pkgNameSuffix = 'en.dramacool'
extClass = '.DramaCool'
extVersionCode = 22
extVersionCode = 23
libVersion = '13'
}
dependencies {
implementation(project(':lib-dood-extractor'))
}
apply from: "$rootDir/common.gradle"

View File

@ -6,7 +6,7 @@ import android.widget.Toast
import androidx.preference.ListPreference
import androidx.preference.PreferenceScreen
import eu.kanade.tachiyomi.AppInfo
import eu.kanade.tachiyomi.animeextension.en.dramacool.extractors.DoodExtractor
import eu.kanade.tachiyomi.lib.doodextractor.DoodExtractor
import eu.kanade.tachiyomi.animeextension.en.dramacool.extractors.FembedExtractor
import eu.kanade.tachiyomi.animeextension.en.dramacool.extractors.StreamSBExtractor
import eu.kanade.tachiyomi.animeextension.en.dramacool.extractors.StreamTapeExtractor

View File

@ -1,43 +0,0 @@
package eu.kanade.tachiyomi.animeextension.en.dramacool.extractors
import eu.kanade.tachiyomi.animesource.model.Video
import eu.kanade.tachiyomi.network.GET
import okhttp3.Headers
import okhttp3.OkHttpClient
class DoodExtractor(private val client: OkHttpClient) {
fun videoFromUrl(url: String): Video? {
val response = client.newCall(GET(url)).execute()
// Overwrite url to the redirected one
val url = response.request.url.toString()
val doodTld = url.substringAfter("https://dood.").substringBefore("/")
val content = response.body!!.string()
if (!content.contains("'/pass_md5/")) return null
val md5 = content.substringAfter("'/pass_md5/").substringBefore("',")
val token = md5.substringAfterLast("/")
val randomString = getRandomString()
val expiry = System.currentTimeMillis()
val videoUrlStart = client.newCall(
GET(
"https://dood.$doodTld/pass_md5/$md5",
Headers.headersOf("referer", url)
)
).execute().body!!.string()
val videoUrl = "$videoUrlStart$randomString?token=$token&expiry=$expiry"
val newQuality = "Doodstream mirror"
return Video(url, newQuality, videoUrl, headers = doodHeaders(doodTld))
}
private fun getRandomString(length: Int = 10): String {
val allowedChars = ('A'..'Z') + ('a'..'z') + ('0'..'9')
return (1..length)
.map { allowedChars.random() }
.joinToString("")
}
private fun doodHeaders(tld: String) = Headers.Builder().apply {
add("User-Agent", "Aniyomi")
add("Referer", "https://dood.$tld/")
}.build()
}

View File

@ -5,8 +5,12 @@ ext {
extName = 'GenoAnime'
pkgNameSuffix = 'en.genoanime'
extClass = '.GenoAnime'
extVersionCode = 16
extVersionCode = 17
libVersion = '13'
}
dependencies {
implementation(project(':lib-dood-extractor'))
}
apply from: "$rootDir/common.gradle"

View File

@ -4,7 +4,7 @@ import android.app.Application
import android.content.SharedPreferences
import androidx.preference.ListPreference
import androidx.preference.PreferenceScreen
import eu.kanade.tachiyomi.animeextension.en.genoanime.extractors.DoodExtractor
import eu.kanade.tachiyomi.lib.doodextractor.DoodExtractor
import eu.kanade.tachiyomi.animeextension.en.genoanime.extractors.FembedExtractor
import eu.kanade.tachiyomi.animeextension.en.genoanime.extractors.StreamSBExtractor
import eu.kanade.tachiyomi.animeextension.en.genoanime.extractors.StreamTapeExtractor

View File

@ -1,43 +0,0 @@
package eu.kanade.tachiyomi.animeextension.en.genoanime.extractors
import eu.kanade.tachiyomi.animesource.model.Video
import eu.kanade.tachiyomi.network.GET
import okhttp3.Headers
import okhttp3.OkHttpClient
class DoodExtractor(private val client: OkHttpClient) {
fun videoFromUrl(url: String): Video? {
val response = client.newCall(GET(url)).execute()
// Overwrite url to the redirected one
val url = response.request.url.toString()
val doodTld = url.substringAfter("https://dood.").substringBefore("/")
val content = response.body!!.string()
if (!content.contains("'/pass_md5/")) return null
val md5 = content.substringAfter("'/pass_md5/").substringBefore("',")
val token = md5.substringAfterLast("/")
val randomString = getRandomString()
val expiry = System.currentTimeMillis()
val videoUrlStart = client.newCall(
GET(
"https://dood.$doodTld/pass_md5/$md5",
Headers.headersOf("referer", url)
)
).execute().body!!.string()
val videoUrl = "$videoUrlStart$randomString?token=$token&expiry=$expiry"
val newQuality = "Doodstream mirror"
return Video(url, newQuality, videoUrl, headers = doodHeaders(doodTld))
}
private fun getRandomString(length: Int = 10): String {
val allowedChars = ('A'..'Z') + ('a'..'z') + ('0'..'9')
return (1..length)
.map { allowedChars.random() }
.joinToString("")
}
private fun doodHeaders(tld: String) = Headers.Builder().apply {
add("User-Agent", "Aniyomi")
add("Referer", "https://dood.$tld/")
}.build()
}

View File

@ -5,8 +5,12 @@ ext {
extName = 'Gogoanime'
pkgNameSuffix = 'en.gogoanime'
extClass = '.GogoAnime'
extVersionCode = 48
extVersionCode = 49
libVersion = '13'
}
dependencies {
implementation(project(':lib-dood-extractor'))
}
apply from: "$rootDir/common.gradle"

View File

@ -4,7 +4,7 @@ import android.app.Application
import android.content.SharedPreferences
import androidx.preference.ListPreference
import androidx.preference.PreferenceScreen
import eu.kanade.tachiyomi.animeextension.en.gogoanime.extractors.DoodExtractor
import eu.kanade.tachiyomi.lib.doodextractor.DoodExtractor
import eu.kanade.tachiyomi.animeextension.en.gogoanime.extractors.GogoCdnExtractor
import eu.kanade.tachiyomi.animeextension.en.gogoanime.extractors.StreamSBExtractor
import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource

View File

@ -1,43 +0,0 @@
package eu.kanade.tachiyomi.animeextension.en.gogoanime.extractors
import eu.kanade.tachiyomi.animesource.model.Video
import eu.kanade.tachiyomi.network.GET
import okhttp3.Headers
import okhttp3.OkHttpClient
class DoodExtractor(private val client: OkHttpClient) {
fun videosFromUrl(serverUrl: String): List<Video> {
try {
val response = client.newCall(GET(serverUrl)).execute()
val doodTld = serverUrl.substringAfter("https://dood.").substringBefore("/")
val content = response.body!!.string()
if (!content.contains("'/pass_md5/")) return emptyList()
val md5 = content.substringAfter("'/pass_md5/").substringBefore("',")
val token = md5.substringAfterLast("/")
val randomString = getRandomString()
val expiry = System.currentTimeMillis()
val videoUrlStart = client.newCall(
GET(
"https://dood.$doodTld/pass_md5/$md5",
Headers.headersOf("referer", serverUrl)
)
).execute().body!!.string()
val videoUrl = "$videoUrlStart$randomString?token=$token&expiry=$expiry"
return listOf(Video(serverUrl, "Doodstream", videoUrl, headers = doodHeaders(doodTld)))
} catch (e: Exception) {
return emptyList()
}
}
private fun getRandomString(length: Int = 10): String {
val allowedChars = ('A'..'Z') + ('a'..'z') + ('0'..'9')
return (1..length)
.map { allowedChars.random() }
.joinToString("")
}
private fun doodHeaders(tld: String) = Headers.Builder().apply {
add("User-Agent", "Aniyomi")
add("Referer", "https://dood.$tld/")
}.build()
}

View File

@ -5,8 +5,12 @@ ext {
extName = 'KickAssAnime'
pkgNameSuffix = 'en.kickassanime'
extClass = '.KickAssAnime'
extVersionCode = 9
extVersionCode = 10
libVersion = '13'
}
dependencies {
implementation(project(':lib-dood-extractor'))
}
apply from: "$rootDir/common.gradle"

View File

@ -6,7 +6,7 @@ import android.net.Uri
import android.util.Base64
import androidx.preference.ListPreference
import androidx.preference.PreferenceScreen
import eu.kanade.tachiyomi.animeextension.en.kickassanime.extractors.DoodExtractor
import eu.kanade.tachiyomi.lib.doodextractor.DoodExtractor
import eu.kanade.tachiyomi.animeextension.en.kickassanime.extractors.GogoCdnExtractor
import eu.kanade.tachiyomi.animeextension.en.kickassanime.extractors.StreamSBExtractor
import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource

View File

@ -1,43 +0,0 @@
package eu.kanade.tachiyomi.animeextension.en.kickassanime.extractors
import eu.kanade.tachiyomi.animesource.model.Video
import eu.kanade.tachiyomi.network.GET
import okhttp3.Headers
import okhttp3.OkHttpClient
class DoodExtractor(private val client: OkHttpClient) {
fun videosFromUrl(serverUrl: String): List<Video> {
try {
val response = client.newCall(GET(serverUrl)).execute()
val doodTld = serverUrl.substringAfter("https://dood.").substringBefore("/")
val content = response.body!!.string()
if (!content.contains("'/pass_md5/")) return emptyList()
val md5 = content.substringAfter("'/pass_md5/").substringBefore("',")
val token = md5.substringAfterLast("/")
val randomString = getRandomString()
val expiry = System.currentTimeMillis()
val videoUrlStart = client.newCall(
GET(
"https://dood.$doodTld/pass_md5/$md5",
Headers.headersOf("referer", serverUrl)
)
).execute().body!!.string()
val videoUrl = "$videoUrlStart$randomString?token=$token&expiry=$expiry"
return listOf(Video(serverUrl, "Doodstream", videoUrl, headers = doodHeaders(doodTld)))
} catch (e: Exception) {
return emptyList()
}
}
private fun getRandomString(length: Int = 10): String {
val allowedChars = ('A'..'Z') + ('a'..'z') + ('0'..'9')
return (1..length)
.map { allowedChars.random() }
.joinToString("")
}
private fun doodHeaders(tld: String) = Headers.Builder().apply {
add("User-Agent", "Aniyomi")
add("Referer", "https://dood.$tld/")
}.build()
}

View File

@ -5,12 +5,13 @@ ext {
extName = 'Sflix'
pkgNameSuffix = 'en.sflix'
extClass = '.SFlix'
extVersionCode = 10
extVersionCode = 11
libVersion = '13'
}
dependencies {
compileOnly libs.bundles.coroutines
implementation(project(':lib-dood-extractor'))
}
apply from: "$rootDir/common.gradle"

View File

@ -4,7 +4,7 @@ import android.app.Application
import android.content.SharedPreferences
import androidx.preference.ListPreference
import androidx.preference.PreferenceScreen
import eu.kanade.tachiyomi.animeextension.en.sflix.extractors.DoodExtractor
import eu.kanade.tachiyomi.lib.doodextractor.DoodExtractor
import eu.kanade.tachiyomi.animeextension.en.sflix.extractors.SFlixExtractor
import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource
import eu.kanade.tachiyomi.animesource.model.AnimeFilterList

View File

@ -1,43 +0,0 @@
package eu.kanade.tachiyomi.animeextension.en.sflix.extractors
import eu.kanade.tachiyomi.animesource.model.Video
import eu.kanade.tachiyomi.network.GET
import okhttp3.Headers
import okhttp3.OkHttpClient
class DoodExtractor(private val client: OkHttpClient) {
fun videoFromUrl(url: String): Video? {
val response = client.newCall(GET(url)).execute()
// Overwrite url to the redirected one
val url = response.request.url.toString()
val doodTld = url.substringAfter("https://dood.").substringBefore("/")
val content = response.body!!.string()
if (!content.contains("'/pass_md5/")) return null
val md5 = content.substringAfter("'/pass_md5/").substringBefore("',")
val token = md5.substringAfterLast("/")
val randomString = getRandomString()
val expiry = System.currentTimeMillis()
val videoUrlStart = client.newCall(
GET(
"https://dood.$doodTld/pass_md5/$md5",
Headers.headersOf("referer", url)
)
).execute().body!!.string()
val videoUrl = "$videoUrlStart$randomString?token=$token&expiry=$expiry"
val newQuality = "DoodStream mirror"
return Video(url, newQuality, videoUrl, headers = doodHeaders(doodTld))
}
private fun getRandomString(length: Int = 10): String {
val allowedChars = ('A'..'Z') + ('a'..'z') + ('0'..'9')
return (1..length)
.map { allowedChars.random() }
.joinToString("")
}
private fun doodHeaders(tld: String) = Headers.Builder().apply {
add("User-Agent", "Aniyomi")
add("Referer", "https://dood.$tld/")
}.build()
}

View File

@ -5,8 +5,12 @@ ext {
extName = 'AnimeFLV'
pkgNameSuffix = 'es.animeflv'
extClass = '.AnimeFlv'
extVersionCode = 29
extVersionCode = 30
libVersion = '13'
}
dependencies {
implementation(project(':lib-dood-extractor'))
}
apply from: "$rootDir/common.gradle"

View File

@ -4,7 +4,7 @@ import android.app.Application
import android.content.SharedPreferences
import androidx.preference.ListPreference
import androidx.preference.PreferenceScreen
import eu.kanade.tachiyomi.animeextension.es.animeflv.extractors.DoodExtractor
import eu.kanade.tachiyomi.lib.doodextractor.DoodExtractor
import eu.kanade.tachiyomi.animeextension.es.animeflv.extractors.FembedExtractor
import eu.kanade.tachiyomi.animeextension.es.animeflv.extractors.OkruExtractor
import eu.kanade.tachiyomi.animeextension.es.animeflv.extractors.StreamSBExtractor
@ -137,7 +137,7 @@ class AnimeFlv : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
if (video != null) videoList.add(video)
}
if (quality == "Doodstream") {
val video = DoodExtractor(client).videoFromUrl(url, "DoodStream")
val video = DoodExtractor(client).videoFromUrl(url, "DoodStream", false)
if (video != null) videoList.add(video)
}
if (quality == "Okru") {

View File

@ -1,43 +0,0 @@
package eu.kanade.tachiyomi.animeextension.es.animeflv.extractors
import eu.kanade.tachiyomi.animesource.model.Video
import eu.kanade.tachiyomi.network.GET
import okhttp3.Headers
import okhttp3.OkHttpClient
class DoodExtractor(private val client: OkHttpClient) {
fun videoFromUrl(url: String, quality: String): Video? {
return try {
val response = client.newCall(GET(url)).execute()
val doodTld = url.substringAfter("https://dood.").substringBefore("/")
val content = response.body!!.string()
if (!content.contains("'/pass_md5/")) return null
val md5 = content.substringAfter("'/pass_md5/").substringBefore("',")
val token = md5.substringAfterLast("/")
val randomString = getRandomString()
val expiry = System.currentTimeMillis()
val videoUrlStart = client.newCall(
GET(
"https://dood.$doodTld/pass_md5/$md5",
Headers.headersOf("referer", url)
)
).execute().body!!.string()
val videoUrl = "$videoUrlStart$randomString?token=$token&expiry=$expiry"
Video(url, quality, videoUrl, headers = doodHeaders(doodTld))
} catch (e: Exception) {
null
}
}
private fun getRandomString(length: Int = 10): String {
val allowedChars = ('A'..'Z') + ('a'..'z') + ('0'..'9')
return (1..length)
.map { allowedChars.random() }
.joinToString("")
}
private fun doodHeaders(tld: String) = Headers.Builder().apply {
add("User-Agent", "Aniyomi")
add("Referer", "https://dood.$tld/")
}.build()
}

View File

@ -5,8 +5,12 @@ ext {
extName = 'AnimeLatinoHD'
pkgNameSuffix = 'es.animelatinohd'
extClass = '.AnimeLatinoHD'
extVersionCode = 7
extVersionCode = 8
libVersion = '13'
}
dependencies {
implementation(project(':lib-dood-extractor'))
}
apply from: "$rootDir/common.gradle"

View File

@ -4,7 +4,7 @@ import android.app.Application
import android.content.SharedPreferences
import androidx.preference.ListPreference
import androidx.preference.PreferenceScreen
import eu.kanade.tachiyomi.animeextension.es.animelatinohd.extractors.DoodExtractor
import eu.kanade.tachiyomi.lib.doodextractor.DoodExtractor
import eu.kanade.tachiyomi.animeextension.es.animelatinohd.extractors.FembedExtractor
import eu.kanade.tachiyomi.animeextension.es.animelatinohd.extractors.OkruExtractor
import eu.kanade.tachiyomi.animeextension.es.animelatinohd.extractors.SolidFilesExtractor

View File

@ -5,8 +5,12 @@ ext {
extName = 'AnimeonlineNinja'
pkgNameSuffix = 'es.animeonlineninja'
extClass = '.AnimeonlineNinja'
extVersionCode = 10
extVersionCode = 11
libVersion = '13'
}
dependencies {
implementation(project(':lib-dood-extractor'))
}
apply from: "$rootDir/common.gradle"

View File

@ -4,7 +4,7 @@ import android.app.Application
import android.content.SharedPreferences
import androidx.preference.ListPreference
import androidx.preference.PreferenceScreen
import eu.kanade.tachiyomi.animeextension.es.animeonlineninja.extractors.DoodExtractor
import eu.kanade.tachiyomi.lib.doodextractor.DoodExtractor
import eu.kanade.tachiyomi.animeextension.es.animeonlineninja.extractors.FembedExtractor
import eu.kanade.tachiyomi.animeextension.es.animeonlineninja.extractors.JsUnpacker
import eu.kanade.tachiyomi.animeextension.es.animeonlineninja.extractors.StreamSBExtractor
@ -147,7 +147,7 @@ class AnimeonlineNinja : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
StreamTapeExtractor(client).videoFromUrl(serverUrl, "$lang StreamTape")?.let { it1 -> videos.add(it1) }
}
serverUrl.contains("dood") && lang.contains(langSelect) -> {
DoodExtractor(client).videoFromUrl(serverUrl, "$lang DoodStream")?.let { it1 -> videos.add(it1) }
DoodExtractor(client).videoFromUrl(serverUrl, "$lang DoodStream", false)?.let { it1 -> videos.add(it1) }
}
serverUrl.contains("sb") && lang.contains(langSelect) -> {
try {

View File

@ -1,43 +0,0 @@
package eu.kanade.tachiyomi.animeextension.es.animeonlineninja.extractors
import eu.kanade.tachiyomi.animesource.model.Video
import eu.kanade.tachiyomi.network.GET
import okhttp3.Headers
import okhttp3.OkHttpClient
class DoodExtractor(private val client: OkHttpClient) {
fun videoFromUrl(url: String, quality: String): Video? {
return try {
val response = client.newCall(GET(url)).execute()
val doodTld = url.substringAfter("https://dood.").substringBefore("/")
val content = response.body!!.string()
if (!content.contains("'/pass_md5/")) return null
val md5 = content.substringAfter("'/pass_md5/").substringBefore("',")
val token = md5.substringAfterLast("/")
val randomString = getRandomString()
val expiry = System.currentTimeMillis()
val videoUrlStart = client.newCall(
GET(
"https://dood.$doodTld/pass_md5/$md5",
Headers.headersOf("referer", url)
)
).execute().body!!.string()
val videoUrl = "$videoUrlStart$randomString?token=$token&expiry=$expiry"
Video(url, quality, videoUrl, headers = doodHeaders(doodTld))
} catch (e: Exception) {
null
}
}
private fun getRandomString(length: Int = 10): String {
val allowedChars = ('A'..'Z') + ('a'..'z') + ('0'..'9')
return (1..length)
.map { allowedChars.random() }
.joinToString("")
}
private fun doodHeaders(tld: String) = Headers.Builder().apply {
add("User-Agent", "Aniyomi")
add("Referer", "https://dood.$tld/")
}.build()
}

View File

@ -5,8 +5,12 @@ ext {
extName = 'Pelisflix'
pkgNameSuffix = 'es.pelisflix'
extClass = '.PelisflixFactory'
extVersionCode = 5
extVersionCode = 6
libVersion = '13'
}
dependencies {
implementation(project(':lib-dood-extractor'))
}
apply from: "$rootDir/common.gradle"

View File

@ -5,7 +5,7 @@ import android.content.SharedPreferences
import android.util.Log
import androidx.preference.ListPreference
import androidx.preference.PreferenceScreen
import eu.kanade.tachiyomi.animeextension.es.pelisflix.extractors.DoodExtractor
import eu.kanade.tachiyomi.lib.doodextractor.DoodExtractor
import eu.kanade.tachiyomi.animeextension.es.pelisflix.extractors.FembedExtractor
import eu.kanade.tachiyomi.animeextension.es.pelisflix.extractors.StreamTapeExtractor
import eu.kanade.tachiyomi.animesource.AnimeSource
@ -60,7 +60,7 @@ class SeriesflixClass : Pelisflix("Seriesflix", "https://seriesflix.video") {
}
}
if (serverUrl.contains("doodstream")) {
val video = DoodExtractor(client).videoFromUrl(serverUrl.replace("https://doodstream.com", "https://dood.wf"), lang + "DoodStream")
val video = DoodExtractor(client).videoFromUrl(serverUrl.replace("https://doodstream.com", "https://dood.wf"), lang + "DoodStream", false)
if (video != null) videoList.add(video)
}
if (serverUrl.contains("streamtape")) {

View File

@ -1,43 +0,0 @@
package eu.kanade.tachiyomi.animeextension.es.pelisflix.extractors
import eu.kanade.tachiyomi.animesource.model.Video
import eu.kanade.tachiyomi.network.GET
import okhttp3.Headers
import okhttp3.OkHttpClient
class DoodExtractor(private val client: OkHttpClient) {
fun videoFromUrl(url: String, quality: String): Video? {
return try {
val response = client.newCall(GET(url)).execute()
val doodTld = url.substringAfter("https://dood.").substringBefore("/")
val content = response.body!!.string()
if (!content.contains("'/pass_md5/")) return null
val md5 = content.substringAfter("'/pass_md5/").substringBefore("',")
val token = md5.substringAfterLast("/")
val randomString = getRandomString()
val expiry = System.currentTimeMillis()
val videoUrlStart = client.newCall(
GET(
"https://dood.$doodTld/pass_md5/$md5",
Headers.headersOf("referer", url)
)
).execute().body!!.string()
val videoUrl = "$videoUrlStart$randomString?token=$token&expiry=$expiry"
Video(url, quality, videoUrl, headers = doodHeaders(doodTld))
} catch (e: Exception) {
null
}
}
private fun getRandomString(length: Int = 10): String {
val allowedChars = ('A'..'Z') + ('a'..'z') + ('0'..'9')
return (1..length)
.map { allowedChars.random() }
.joinToString("")
}
private fun doodHeaders(tld: String) = Headers.Builder().apply {
add("User-Agent", "Aniyomi")
add("Referer", "https://dood.$tld/")
}.build()
}

View File

@ -5,8 +5,12 @@ ext {
extName = 'Pelisplushd'
pkgNameSuffix = 'es.pelisplushd'
extClass = '.Pelisplushd'
extVersionCode = 19
extVersionCode = 20
libVersion = '13'
}
dependencies {
implementation(project(':lib-dood-extractor'))
}
apply from: "$rootDir/common.gradle"

View File

@ -5,7 +5,7 @@ import android.content.SharedPreferences
import android.util.Base64
import androidx.preference.ListPreference
import androidx.preference.PreferenceScreen
import eu.kanade.tachiyomi.animeextension.es.pelisplushd.extractors.DoodExtractor
import eu.kanade.tachiyomi.lib.doodextractor.DoodExtractor
import eu.kanade.tachiyomi.animeextension.es.pelisplushd.extractors.FembedExtractor
import eu.kanade.tachiyomi.animeextension.es.pelisplushd.extractors.StreamSBExtractor
import eu.kanade.tachiyomi.animeextension.es.pelisplushd.extractors.StreamTapeExtractor
@ -216,7 +216,7 @@ class Pelisplushd : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
}
"doodstream" -> {
val url2 = url.replace("https://doodstream.com/e/", "https://dood.to/e/")
val video = DoodExtractor(client).videoFromUrl(url2, "DoodStream")
val video = DoodExtractor(client).videoFromUrl(url2, "DoodStream", false)
if (video != null) {
videoList.add(video)
}

View File

@ -1,43 +0,0 @@
package eu.kanade.tachiyomi.animeextension.es.pelisplushd.extractors
import eu.kanade.tachiyomi.animesource.model.Video
import eu.kanade.tachiyomi.network.GET
import okhttp3.Headers
import okhttp3.OkHttpClient
class DoodExtractor(private val client: OkHttpClient) {
fun videoFromUrl(url: String, quality: String): Video? {
return try {
val response = client.newCall(GET(url)).execute()
val doodTld = url.substringAfter("https://dood.").substringBefore("/")
val content = response.body!!.string()
if (!content.contains("'/pass_md5/")) return null
val md5 = content.substringAfter("'/pass_md5/").substringBefore("',")
val token = md5.substringAfterLast("/")
val randomString = getRandomString()
val expiry = System.currentTimeMillis()
val videoUrlStart = client.newCall(
GET(
"https://dood.$doodTld/pass_md5/$md5",
Headers.headersOf("referer", url)
)
).execute().body!!.string()
val videoUrl = "$videoUrlStart$randomString?token=$token&expiry=$expiry"
Video(url, quality, videoUrl, headers = doodHeaders(doodTld))
} catch (e: Exception) {
null
}
}
private fun getRandomString(length: Int = 10): String {
val allowedChars = ('A'..'Z') + ('a'..'z') + ('0'..'9')
return (1..length)
.map { allowedChars.random() }
.joinToString("")
}
private fun doodHeaders(tld: String) = Headers.Builder().apply {
add("User-Agent", "Aniyomi")
add("Referer", "https://dood.$tld/")
}.build()
}

View File

@ -5,8 +5,12 @@ ext {
extName = 'Vostfree'
pkgNameSuffix = 'fr.vostfree'
extClass = '.Vostfree'
extVersionCode = 9
extVersionCode = 10
libVersion = '13'
}
dependencies {
implementation(project(':lib-dood-extractor'))
}
apply from: "$rootDir/common.gradle"

View File

@ -4,7 +4,7 @@ import android.app.Application
import android.content.SharedPreferences
import androidx.preference.ListPreference
import androidx.preference.PreferenceScreen
import eu.kanade.tachiyomi.animeextension.fr.vostfree.extractors.DoodExtractor
import eu.kanade.tachiyomi.lib.doodextractor.DoodExtractor
import eu.kanade.tachiyomi.animeextension.fr.vostfree.extractors.MytvExtractor
import eu.kanade.tachiyomi.animeextension.fr.vostfree.extractors.OkruExtractor
import eu.kanade.tachiyomi.animeextension.fr.vostfree.extractors.VudeoExtractor
@ -121,7 +121,7 @@ class Vostfree : ConfigurableAnimeSource, ParsedAnimeHttpSource() {
if (server.lowercase() == "doodstream") {
val playerId = it.attr("id")
val url = document.select("div#player-tabs div.tab-blocks div.tab-content div div#content_$playerId").text()
val video = DoodExtractor(client).videoFromUrl(url, "DoodStream")
val video = DoodExtractor(client).videoFromUrl(url, "DoodStream", false)
if (video != null) {
videoList.add(video)
}

View File

@ -1,40 +0,0 @@
package eu.kanade.tachiyomi.animeextension.fr.vostfree.extractors
import eu.kanade.tachiyomi.animesource.model.Video
import eu.kanade.tachiyomi.network.GET
import okhttp3.Headers
import okhttp3.OkHttpClient
class DoodExtractor(private val client: OkHttpClient) {
fun videoFromUrl(url: String, quality: String): Video? {
val response = client.newCall(GET(url)).execute()
val doodTld = url.substringAfter("https://dood.").substringBefore("/")
val content = response.body!!.string()
if (!content.contains("'/pass_md5/")) return null
val md5 = content.substringAfter("'/pass_md5/").substringBefore("',")
val token = md5.substringAfterLast("/")
val randomString = getRandomString()
val expiry = System.currentTimeMillis()
val videoUrlStart = client.newCall(
GET(
"https://dood.$doodTld/pass_md5/$md5",
Headers.headersOf("referer", url)
)
).execute().body!!.string()
val videoUrl = "$videoUrlStart$randomString?token=$token&expiry=$expiry"
return Video(url, quality, videoUrl, headers = doodHeaders(doodTld))
}
private fun getRandomString(length: Int = 10): String {
val allowedChars = ('A'..'Z') + ('a'..'z') + ('0'..'9')
return (1..length)
.map { allowedChars.random() }
.joinToString("")
}
private fun doodHeaders(tld: String) = Headers.Builder().apply {
add("User-Agent", "Aniyomi")
add("Referer", "https://dood.$tld/")
}.build()
}

View File

@ -5,8 +5,12 @@ ext {
extName = 'ANIMEWORLD.tv'
pkgNameSuffix = 'it.animeworld'
extClass = '.ANIMEWORLD'
extVersionCode = 12
extVersionCode = 13
libVersion = '13'
}
dependencies {
implementation(project(':lib-dood-extractor'))
}
apply from: "$rootDir/common.gradle"

View File

@ -4,7 +4,7 @@ import android.app.Application
import android.content.SharedPreferences
import androidx.preference.ListPreference
import androidx.preference.PreferenceScreen
import eu.kanade.tachiyomi.animeextension.it.animeworld.extractors.DoodExtractor
import eu.kanade.tachiyomi.lib.doodextractor.DoodExtractor
import eu.kanade.tachiyomi.animeextension.it.animeworld.extractors.StreamSBExtractor
import eu.kanade.tachiyomi.animeextension.it.animeworld.extractors.StreamTapeExtractor
import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource

View File

@ -1,43 +0,0 @@
package eu.kanade.tachiyomi.animeextension.it.animeworld.extractors
import eu.kanade.tachiyomi.animesource.model.Video
import eu.kanade.tachiyomi.network.GET
import okhttp3.Headers
import okhttp3.OkHttpClient
class DoodExtractor(private val client: OkHttpClient) {
fun videoFromUrl(url: String): Video? {
val response = client.newCall(GET(url)).execute()
// Overwrite url to the redirected one
val url = response.request.url.toString()
val doodTld = url.substringAfter("https://dood.").substringBefore("/")
val content = response.body!!.string()
if (!content.contains("'/pass_md5/")) return null
val md5 = content.substringAfter("'/pass_md5/").substringBefore("',")
val token = md5.substringAfterLast("/")
val randomString = getRandomString()
val expiry = System.currentTimeMillis()
val videoUrlStart = client.newCall(
GET(
"https://dood.$doodTld/pass_md5/$md5",
Headers.headersOf("referer", url)
)
).execute().body!!.string()
val videoUrl = "$videoUrlStart$randomString?token=$token&expiry=$expiry"
val newQuality = "Doodstream mirror"
return Video(url, newQuality, videoUrl, headers = doodHeaders(doodTld))
}
private fun getRandomString(length: Int = 10): String {
val allowedChars = ('A'..'Z') + ('a'..'z') + ('0'..'9')
return (1..length)
.map { allowedChars.random() }
.joinToString("")
}
private fun doodHeaders(tld: String) = Headers.Builder().apply {
add("User-Agent", "Aniyomi")
add("Referer", "https://dood.$tld/")
}.build()
}

View File

@ -6,12 +6,12 @@ ext {
extName = 'AnimesVision'
pkgNameSuffix = 'pt.animesvision'
extClass = '.AnimesVision'
extVersionCode = 7
extVersionCode = 8
libVersion = '13'
}
dependencies {
compileOnly 'org.jetbrains.kotlinx:kotlinx-serialization-json:1.3.2'
implementation(project(':lib-dood-extractor'))
}
apply from: "$rootDir/common.gradle"

View File

@ -8,7 +8,7 @@ import androidx.preference.PreferenceScreen
import eu.kanade.tachiyomi.animeextension.pt.animesvision.dto.AVResponseDto
import eu.kanade.tachiyomi.animeextension.pt.animesvision.dto.PayloadData
import eu.kanade.tachiyomi.animeextension.pt.animesvision.dto.PayloadItem
import eu.kanade.tachiyomi.animeextension.pt.animesvision.extractors.DoodExtractor
import eu.kanade.tachiyomi.lib.doodextractor.DoodExtractor
import eu.kanade.tachiyomi.animeextension.pt.animesvision.extractors.GlobalVisionExtractor
import eu.kanade.tachiyomi.animeextension.pt.animesvision.extractors.StreamTapeExtractor
import eu.kanade.tachiyomi.animeextension.pt.animesvision.extractors.VoeExtractor

View File

@ -1,43 +0,0 @@
package eu.kanade.tachiyomi.animeextension.pt.animesvision.extractors
import eu.kanade.tachiyomi.animesource.model.Video
import eu.kanade.tachiyomi.network.GET
import okhttp3.Headers
import okhttp3.OkHttpClient
class DoodExtractor(private val client: OkHttpClient) {
fun videoFromUrl(url: String): Video? {
val response = client.newCall(GET(url)).execute()
// Overwrite url to the redirected one
val url = response.request.url.toString()
val doodTld = url.substringAfter("https://dood.").substringBefore("/")
val content = response.body!!.string()
if (!content.contains("'/pass_md5/")) return null
val md5 = content.substringAfter("'/pass_md5/").substringBefore("',")
val token = md5.substringAfterLast("/")
val randomString = getRandomString()
val expiry = System.currentTimeMillis()
val videoUrlStart = client.newCall(
GET(
"https://dood.$doodTld/pass_md5/$md5",
Headers.headersOf("referer", url)
)
).execute().body!!.string()
val videoUrl = "$videoUrlStart$randomString?token=$token&expiry=$expiry"
val newQuality = "DoodStream mirror"
return Video(url, newQuality, videoUrl, headers = doodHeaders(doodTld))
}
private fun getRandomString(length: Int = 10): String {
val allowedChars = ('A'..'Z') + ('a'..'z') + ('0'..'9')
return (1..length)
.map { allowedChars.random() }
.joinToString("")
}
private fun doodHeaders(tld: String) = Headers.Builder().apply {
add("User-Agent", "Aniyomi")
add("Referer", "https://dood.$tld/")
}.build()
}