refactor: Make extensions use the googledrive-extractor lib (#2081)
This commit is contained in:
@ -1,4 +1,5 @@
|
|||||||
dependencies {
|
dependencies {
|
||||||
implementation(project(':lib-okru-extractor'))
|
implementation(project(':lib-okru-extractor'))
|
||||||
|
implementation(project(':lib-googledrive-extractor'))
|
||||||
implementation(project(':lib-sibnet-extractor'))
|
implementation(project(':lib-sibnet-extractor'))
|
||||||
}
|
}
|
||||||
|
@ -3,8 +3,8 @@ package eu.kanade.tachiyomi.animeextension.pl.desuonline
|
|||||||
import androidx.preference.ListPreference
|
import androidx.preference.ListPreference
|
||||||
import androidx.preference.PreferenceScreen
|
import androidx.preference.PreferenceScreen
|
||||||
import eu.kanade.tachiyomi.animeextension.pl.desuonline.extractors.CDAExtractor
|
import eu.kanade.tachiyomi.animeextension.pl.desuonline.extractors.CDAExtractor
|
||||||
import eu.kanade.tachiyomi.animeextension.pl.desuonline.extractors.GoogleDriveExtractor
|
|
||||||
import eu.kanade.tachiyomi.animesource.model.Video
|
import eu.kanade.tachiyomi.animesource.model.Video
|
||||||
|
import eu.kanade.tachiyomi.lib.googledriveextractor.GoogleDriveExtractor
|
||||||
import eu.kanade.tachiyomi.lib.okruextractor.OkruExtractor
|
import eu.kanade.tachiyomi.lib.okruextractor.OkruExtractor
|
||||||
import eu.kanade.tachiyomi.lib.sibnetextractor.SibnetExtractor
|
import eu.kanade.tachiyomi.lib.sibnetextractor.SibnetExtractor
|
||||||
import eu.kanade.tachiyomi.multisrc.animestream.AnimeStream
|
import eu.kanade.tachiyomi.multisrc.animestream.AnimeStream
|
||||||
|
@ -1,98 +0,0 @@
|
|||||||
package eu.kanade.tachiyomi.animeextension.pl.desuonline.extractors
|
|
||||||
|
|
||||||
import eu.kanade.tachiyomi.animesource.model.Video
|
|
||||||
import eu.kanade.tachiyomi.network.GET
|
|
||||||
import eu.kanade.tachiyomi.network.POST
|
|
||||||
import eu.kanade.tachiyomi.util.asJsoup
|
|
||||||
import okhttp3.Headers
|
|
||||||
import okhttp3.HttpUrl.Companion.toHttpUrl
|
|
||||||
import okhttp3.MediaType.Companion.toMediaType
|
|
||||||
import okhttp3.OkHttpClient
|
|
||||||
import okhttp3.RequestBody.Companion.toRequestBody
|
|
||||||
|
|
||||||
class GoogleDriveExtractor(private val client: OkHttpClient, private val headers: Headers) {
|
|
||||||
// Needs to be the form of `https://drive.google.com/uc?id=GOOGLEDRIVEITEMID`
|
|
||||||
fun videosFromUrl(itemUrl: String, videoName: String = "Video"): List<Video> {
|
|
||||||
val itemHeaders = headers.newBuilder()
|
|
||||||
.add("Accept", "*/*")
|
|
||||||
.add("Accept-Language", "en-US,en;q=0.5")
|
|
||||||
.add("Connection", "keep-alive")
|
|
||||||
.add("Cookie", getCookie(itemUrl))
|
|
||||||
.add("Host", "drive.google.com")
|
|
||||||
.build()
|
|
||||||
|
|
||||||
val itemResponse = client.newCall(
|
|
||||||
GET(itemUrl, headers = itemHeaders),
|
|
||||||
).execute()
|
|
||||||
|
|
||||||
val noRedirectClient = OkHttpClient().newBuilder().followRedirects(false).build()
|
|
||||||
val document = itemResponse.asJsoup()
|
|
||||||
|
|
||||||
val itemSize = document.selectFirst("span.uc-name-size")?.let {
|
|
||||||
" ${it.ownText().trim()} "
|
|
||||||
} ?: ""
|
|
||||||
val url = document.selectFirst("form#download-form")?.attr("action") ?: return emptyList()
|
|
||||||
val redirectHeaders = headers.newBuilder()
|
|
||||||
.add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8")
|
|
||||||
.add("Connection", "keep-alive")
|
|
||||||
.add("Content-Length", "0")
|
|
||||||
.add("Content-Type", "application/x-www-form-urlencoded")
|
|
||||||
.add("Cookie", getCookie(url))
|
|
||||||
.add("Host", "drive.google.com")
|
|
||||||
.add("Origin", "https://drive.google.com")
|
|
||||||
.add("Referer", url.substringBeforeLast("&at="))
|
|
||||||
.build()
|
|
||||||
|
|
||||||
val response = noRedirectClient.newCall(
|
|
||||||
POST(url, headers = redirectHeaders, body = "".toRequestBody("application/x-www-form-urlencoded".toMediaType())),
|
|
||||||
).execute()
|
|
||||||
val redirected = response.headers["location"] ?: return listOf(Video(url, videoName + itemSize, url))
|
|
||||||
|
|
||||||
val redirectedHeaders = headers.newBuilder()
|
|
||||||
.add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8")
|
|
||||||
.add("Connection", "keep-alive")
|
|
||||||
.add("Host", redirected.toHttpUrl().host)
|
|
||||||
.add("Referer", "https://drive.google.com/")
|
|
||||||
.build()
|
|
||||||
|
|
||||||
val redirectedResponseHeaders = noRedirectClient.newCall(
|
|
||||||
GET(redirected, headers = redirectedHeaders),
|
|
||||||
).execute().headers
|
|
||||||
val authCookie = redirectedResponseHeaders.firstOrNull {
|
|
||||||
it.first == "set-cookie" && it.second.startsWith("AUTH_")
|
|
||||||
}?.second?.substringBefore(";") ?: return listOf(Video(url, videoName + itemSize, url))
|
|
||||||
val newRedirected = redirectedResponseHeaders["location"] ?: return listOf(Video(redirected, videoName + itemSize, redirected))
|
|
||||||
|
|
||||||
val googleDriveRedirectHeaders = headers.newBuilder()
|
|
||||||
.add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8")
|
|
||||||
.add("Connection", "keep-alive")
|
|
||||||
.add("Cookie", getCookie(newRedirected))
|
|
||||||
.add("Host", "drive.google.com")
|
|
||||||
.add("Referer", "https://drive.google.com/")
|
|
||||||
.build()
|
|
||||||
val googleDriveRedirectUrl = noRedirectClient.newCall(
|
|
||||||
GET(newRedirected, headers = googleDriveRedirectHeaders),
|
|
||||||
).execute().headers["location"]!!
|
|
||||||
|
|
||||||
val videoHeaders = headers.newBuilder()
|
|
||||||
.add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8")
|
|
||||||
.add("Connection", "keep-alive")
|
|
||||||
.add("Cookie", authCookie)
|
|
||||||
.add("Host", googleDriveRedirectUrl.toHttpUrl().host)
|
|
||||||
.add("Referer", "https://drive.google.com/")
|
|
||||||
.build()
|
|
||||||
|
|
||||||
return listOf(
|
|
||||||
Video(googleDriveRedirectUrl, videoName + itemSize, googleDriveRedirectUrl, headers = videoHeaders),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun getCookie(url: String): String {
|
|
||||||
val cookieList = client.cookieJar.loadForRequest(url.toHttpUrl())
|
|
||||||
return if (cookieList.isNotEmpty()) {
|
|
||||||
cookieList.joinToString("; ") { "${it.name}=${it.value}" }
|
|
||||||
} else {
|
|
||||||
""
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -10,4 +10,8 @@ ext {
|
|||||||
libVersion = '13'
|
libVersion = '13'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
implementation(project(':lib-googledrive-extractor'))
|
||||||
|
}
|
||||||
|
|
||||||
apply from: "$rootDir/common.gradle"
|
apply from: "$rootDir/common.gradle"
|
||||||
|
@ -10,7 +10,6 @@ import android.widget.Toast
|
|||||||
import androidx.preference.EditTextPreference
|
import androidx.preference.EditTextPreference
|
||||||
import androidx.preference.PreferenceScreen
|
import androidx.preference.PreferenceScreen
|
||||||
import androidx.preference.SwitchPreferenceCompat
|
import androidx.preference.SwitchPreferenceCompat
|
||||||
import eu.kanade.tachiyomi.animeextension.all.googledrive.extractors.GoogleDriveExtractor
|
|
||||||
import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource
|
import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource
|
||||||
import eu.kanade.tachiyomi.animesource.model.AnimeFilter
|
import eu.kanade.tachiyomi.animesource.model.AnimeFilter
|
||||||
import eu.kanade.tachiyomi.animesource.model.AnimeFilterList
|
import eu.kanade.tachiyomi.animesource.model.AnimeFilterList
|
||||||
@ -19,6 +18,7 @@ import eu.kanade.tachiyomi.animesource.model.SAnime
|
|||||||
import eu.kanade.tachiyomi.animesource.model.SEpisode
|
import eu.kanade.tachiyomi.animesource.model.SEpisode
|
||||||
import eu.kanade.tachiyomi.animesource.model.Video
|
import eu.kanade.tachiyomi.animesource.model.Video
|
||||||
import eu.kanade.tachiyomi.animesource.online.AnimeHttpSource
|
import eu.kanade.tachiyomi.animesource.online.AnimeHttpSource
|
||||||
|
import eu.kanade.tachiyomi.lib.googledriveextractor.GoogleDriveExtractor
|
||||||
import eu.kanade.tachiyomi.network.GET
|
import eu.kanade.tachiyomi.network.GET
|
||||||
import eu.kanade.tachiyomi.network.POST
|
import eu.kanade.tachiyomi.network.POST
|
||||||
import eu.kanade.tachiyomi.util.asJsoup
|
import eu.kanade.tachiyomi.util.asJsoup
|
||||||
|
@ -1,98 +0,0 @@
|
|||||||
package eu.kanade.tachiyomi.animeextension.all.googledrive.extractors
|
|
||||||
|
|
||||||
import eu.kanade.tachiyomi.animesource.model.Video
|
|
||||||
import eu.kanade.tachiyomi.network.GET
|
|
||||||
import eu.kanade.tachiyomi.network.POST
|
|
||||||
import eu.kanade.tachiyomi.util.asJsoup
|
|
||||||
import okhttp3.Headers
|
|
||||||
import okhttp3.HttpUrl.Companion.toHttpUrl
|
|
||||||
import okhttp3.MediaType.Companion.toMediaType
|
|
||||||
import okhttp3.OkHttpClient
|
|
||||||
import okhttp3.RequestBody.Companion.toRequestBody
|
|
||||||
|
|
||||||
class GoogleDriveExtractor(private val client: OkHttpClient, private val headers: Headers) {
|
|
||||||
// Needs to be the form of `https://drive.google.com/uc?id=GOOGLEDRIVEITEMID`
|
|
||||||
fun videosFromUrl(itemUrl: String, videoName: String = "Video"): List<Video> {
|
|
||||||
val itemHeaders = headers.newBuilder()
|
|
||||||
.add("Accept", "*/*")
|
|
||||||
.add("Accept-Language", "en-US,en;q=0.5")
|
|
||||||
.add("Connection", "keep-alive")
|
|
||||||
.add("Cookie", getCookie(itemUrl))
|
|
||||||
.add("Host", "drive.google.com")
|
|
||||||
.build()
|
|
||||||
|
|
||||||
val itemResponse = client.newCall(
|
|
||||||
GET(itemUrl, headers = itemHeaders),
|
|
||||||
).execute()
|
|
||||||
|
|
||||||
val noRedirectClient = OkHttpClient().newBuilder().followRedirects(false).build()
|
|
||||||
val document = itemResponse.asJsoup()
|
|
||||||
|
|
||||||
val itemSize = document.selectFirst("span.uc-name-size")?.let {
|
|
||||||
" ${it.ownText().trim()} "
|
|
||||||
} ?: ""
|
|
||||||
val url = document.selectFirst("form#download-form")?.attr("action") ?: return emptyList()
|
|
||||||
val redirectHeaders = headers.newBuilder()
|
|
||||||
.add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8")
|
|
||||||
.add("Connection", "keep-alive")
|
|
||||||
.add("Content-Length", "0")
|
|
||||||
.add("Content-Type", "application/x-www-form-urlencoded")
|
|
||||||
.add("Cookie", getCookie(url))
|
|
||||||
.add("Host", "drive.google.com")
|
|
||||||
.add("Origin", "https://drive.google.com")
|
|
||||||
.add("Referer", url.substringBeforeLast("&at="))
|
|
||||||
.build()
|
|
||||||
|
|
||||||
val response = noRedirectClient.newCall(
|
|
||||||
POST(url, headers = redirectHeaders, body = "".toRequestBody("application/x-www-form-urlencoded".toMediaType())),
|
|
||||||
).execute()
|
|
||||||
val redirected = response.headers["location"] ?: return listOf(Video(url, videoName + itemSize, url))
|
|
||||||
|
|
||||||
val redirectedHeaders = headers.newBuilder()
|
|
||||||
.add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8")
|
|
||||||
.add("Connection", "keep-alive")
|
|
||||||
.add("Host", redirected.toHttpUrl().host)
|
|
||||||
.add("Referer", "https://drive.google.com/")
|
|
||||||
.build()
|
|
||||||
|
|
||||||
val redirectedResponseHeaders = noRedirectClient.newCall(
|
|
||||||
GET(redirected, headers = redirectedHeaders),
|
|
||||||
).execute().headers
|
|
||||||
val authCookie = redirectedResponseHeaders.firstOrNull {
|
|
||||||
it.first == "set-cookie" && it.second.startsWith("AUTH_")
|
|
||||||
}?.second?.substringBefore(";") ?: return listOf(Video(url, videoName + itemSize, url))
|
|
||||||
val newRedirected = redirectedResponseHeaders["location"] ?: return listOf(Video(redirected, videoName + itemSize, redirected))
|
|
||||||
|
|
||||||
val googleDriveRedirectHeaders = headers.newBuilder()
|
|
||||||
.add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8")
|
|
||||||
.add("Connection", "keep-alive")
|
|
||||||
.add("Cookie", getCookie(newRedirected))
|
|
||||||
.add("Host", "drive.google.com")
|
|
||||||
.add("Referer", "https://drive.google.com/")
|
|
||||||
.build()
|
|
||||||
val googleDriveRedirectUrl = noRedirectClient.newCall(
|
|
||||||
GET(newRedirected, headers = googleDriveRedirectHeaders),
|
|
||||||
).execute().headers["location"]!!
|
|
||||||
|
|
||||||
val videoHeaders = headers.newBuilder()
|
|
||||||
.add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8")
|
|
||||||
.add("Connection", "keep-alive")
|
|
||||||
.add("Cookie", authCookie)
|
|
||||||
.add("Host", googleDriveRedirectUrl.toHttpUrl().host)
|
|
||||||
.add("Referer", "https://drive.google.com/")
|
|
||||||
.build()
|
|
||||||
|
|
||||||
return listOf(
|
|
||||||
Video(googleDriveRedirectUrl, videoName + itemSize, googleDriveRedirectUrl, headers = videoHeaders),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun getCookie(url: String): String {
|
|
||||||
val cookieList = client.cookieJar.loadForRequest(url.toHttpUrl())
|
|
||||||
return if (cookieList.isNotEmpty()) {
|
|
||||||
cookieList.joinToString("; ") { "${it.name}=${it.value}" }
|
|
||||||
} else {
|
|
||||||
""
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -10,4 +10,8 @@ ext {
|
|||||||
libVersion = '13'
|
libVersion = '13'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
implementation(project(':lib-googledrive-extractor'))
|
||||||
|
}
|
||||||
|
|
||||||
apply from: "$rootDir/common.gradle"
|
apply from: "$rootDir/common.gradle"
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package eu.kanade.tachiyomi.animeextension.en.holamovies.extractors
|
package eu.kanade.tachiyomi.animeextension.en.holamovies.extractors
|
||||||
|
|
||||||
import eu.kanade.tachiyomi.animesource.model.Video
|
import eu.kanade.tachiyomi.animesource.model.Video
|
||||||
|
import eu.kanade.tachiyomi.lib.googledriveextractor.GoogleDriveExtractor
|
||||||
import eu.kanade.tachiyomi.network.GET
|
import eu.kanade.tachiyomi.network.GET
|
||||||
import eu.kanade.tachiyomi.network.POST
|
import eu.kanade.tachiyomi.network.POST
|
||||||
import eu.kanade.tachiyomi.util.asJsoup
|
import eu.kanade.tachiyomi.util.asJsoup
|
||||||
|
@ -1,6 +1,7 @@
|
|||||||
package eu.kanade.tachiyomi.animeextension.en.holamovies.extractors
|
package eu.kanade.tachiyomi.animeextension.en.holamovies.extractors
|
||||||
|
|
||||||
import eu.kanade.tachiyomi.animesource.model.Video
|
import eu.kanade.tachiyomi.animesource.model.Video
|
||||||
|
import eu.kanade.tachiyomi.lib.googledriveextractor.GoogleDriveExtractor
|
||||||
import eu.kanade.tachiyomi.network.GET
|
import eu.kanade.tachiyomi.network.GET
|
||||||
import eu.kanade.tachiyomi.util.asJsoup
|
import eu.kanade.tachiyomi.util.asJsoup
|
||||||
import okhttp3.Headers
|
import okhttp3.Headers
|
||||||
|
@ -1,98 +0,0 @@
|
|||||||
package eu.kanade.tachiyomi.animeextension.en.holamovies.extractors
|
|
||||||
|
|
||||||
import eu.kanade.tachiyomi.animesource.model.Video
|
|
||||||
import eu.kanade.tachiyomi.network.GET
|
|
||||||
import eu.kanade.tachiyomi.network.POST
|
|
||||||
import eu.kanade.tachiyomi.util.asJsoup
|
|
||||||
import okhttp3.Headers
|
|
||||||
import okhttp3.HttpUrl.Companion.toHttpUrl
|
|
||||||
import okhttp3.MediaType.Companion.toMediaType
|
|
||||||
import okhttp3.OkHttpClient
|
|
||||||
import okhttp3.RequestBody.Companion.toRequestBody
|
|
||||||
|
|
||||||
class GoogleDriveExtractor(private val client: OkHttpClient, private val headers: Headers) {
|
|
||||||
// Needs to be the form of `https://drive.google.com/uc?id=GOOGLEDRIVEITEMID`
|
|
||||||
fun videosFromUrl(itemUrl: String, videoName: String = "Video"): List<Video> {
|
|
||||||
val itemHeaders = headers.newBuilder()
|
|
||||||
.add("Accept", "*/*")
|
|
||||||
.add("Accept-Language", "en-US,en;q=0.5")
|
|
||||||
.add("Connection", "keep-alive")
|
|
||||||
.add("Cookie", getCookie(itemUrl))
|
|
||||||
.add("Host", "drive.google.com")
|
|
||||||
.build()
|
|
||||||
|
|
||||||
val itemResponse = client.newCall(
|
|
||||||
GET(itemUrl, headers = itemHeaders),
|
|
||||||
).execute()
|
|
||||||
|
|
||||||
val noRedirectClient = OkHttpClient().newBuilder().followRedirects(false).build()
|
|
||||||
val document = itemResponse.asJsoup()
|
|
||||||
|
|
||||||
val itemSize = document.selectFirst("span.uc-name-size")?.let {
|
|
||||||
" ${it.ownText().trim()} "
|
|
||||||
} ?: ""
|
|
||||||
val url = document.selectFirst("form#download-form")?.attr("action") ?: return emptyList()
|
|
||||||
val redirectHeaders = headers.newBuilder()
|
|
||||||
.add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8")
|
|
||||||
.add("Connection", "keep-alive")
|
|
||||||
.add("Content-Length", "0")
|
|
||||||
.add("Content-Type", "application/x-www-form-urlencoded")
|
|
||||||
.add("Cookie", getCookie(url))
|
|
||||||
.add("Host", "drive.google.com")
|
|
||||||
.add("Origin", "https://drive.google.com")
|
|
||||||
.add("Referer", url.substringBeforeLast("&at="))
|
|
||||||
.build()
|
|
||||||
|
|
||||||
val response = noRedirectClient.newCall(
|
|
||||||
POST(url, headers = redirectHeaders, body = "".toRequestBody("application/x-www-form-urlencoded".toMediaType())),
|
|
||||||
).execute()
|
|
||||||
val redirected = response.headers["location"] ?: return listOf(Video(url, videoName + itemSize, url))
|
|
||||||
|
|
||||||
val redirectedHeaders = headers.newBuilder()
|
|
||||||
.add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8")
|
|
||||||
.add("Connection", "keep-alive")
|
|
||||||
.add("Host", redirected.toHttpUrl().host)
|
|
||||||
.add("Referer", "https://drive.google.com/")
|
|
||||||
.build()
|
|
||||||
|
|
||||||
val redirectedResponseHeaders = noRedirectClient.newCall(
|
|
||||||
GET(redirected, headers = redirectedHeaders),
|
|
||||||
).execute().headers
|
|
||||||
val authCookie = redirectedResponseHeaders.firstOrNull {
|
|
||||||
it.first == "set-cookie" && it.second.startsWith("AUTH_")
|
|
||||||
}?.second?.substringBefore(";") ?: return listOf(Video(url, videoName + itemSize, url))
|
|
||||||
val newRedirected = redirectedResponseHeaders["location"] ?: return listOf(Video(redirected, videoName + itemSize, redirected))
|
|
||||||
|
|
||||||
val googleDriveRedirectHeaders = headers.newBuilder()
|
|
||||||
.add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8")
|
|
||||||
.add("Connection", "keep-alive")
|
|
||||||
.add("Cookie", getCookie(newRedirected))
|
|
||||||
.add("Host", "drive.google.com")
|
|
||||||
.add("Referer", "https://drive.google.com/")
|
|
||||||
.build()
|
|
||||||
val googleDriveRedirectUrl = noRedirectClient.newCall(
|
|
||||||
GET(newRedirected, headers = googleDriveRedirectHeaders),
|
|
||||||
).execute().headers["location"]!!
|
|
||||||
|
|
||||||
val videoHeaders = headers.newBuilder()
|
|
||||||
.add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8")
|
|
||||||
.add("Connection", "keep-alive")
|
|
||||||
.add("Cookie", authCookie)
|
|
||||||
.add("Host", googleDriveRedirectUrl.toHttpUrl().host)
|
|
||||||
.add("Referer", "https://drive.google.com/")
|
|
||||||
.build()
|
|
||||||
|
|
||||||
return listOf(
|
|
||||||
Video(googleDriveRedirectUrl, videoName + itemSize, googleDriveRedirectUrl, headers = videoHeaders),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun getCookie(url: String): String {
|
|
||||||
val cookieList = client.cookieJar.loadForRequest(url.toHttpUrl())
|
|
||||||
return if (cookieList.isNotEmpty()) {
|
|
||||||
cookieList.joinToString("; ") { "${it.name}=${it.value}" }
|
|
||||||
} else {
|
|
||||||
""
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -10,4 +10,8 @@ ext {
|
|||||||
libVersion = '13'
|
libVersion = '13'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
implementation(project(':lib-googledrive-extractor'))
|
||||||
|
}
|
||||||
|
|
||||||
apply from: "$rootDir/common.gradle"
|
apply from: "$rootDir/common.gradle"
|
||||||
|
@ -4,7 +4,6 @@ import android.app.Application
|
|||||||
import android.content.SharedPreferences
|
import android.content.SharedPreferences
|
||||||
import androidx.preference.PreferenceScreen
|
import androidx.preference.PreferenceScreen
|
||||||
import androidx.preference.SwitchPreferenceCompat
|
import androidx.preference.SwitchPreferenceCompat
|
||||||
import eu.kanade.tachiyomi.animeextension.en.kayoanime.extractors.GoogleDriveExtractor
|
|
||||||
import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource
|
import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource
|
||||||
import eu.kanade.tachiyomi.animesource.model.AnimeFilter
|
import eu.kanade.tachiyomi.animesource.model.AnimeFilter
|
||||||
import eu.kanade.tachiyomi.animesource.model.AnimeFilterList
|
import eu.kanade.tachiyomi.animesource.model.AnimeFilterList
|
||||||
@ -13,6 +12,7 @@ import eu.kanade.tachiyomi.animesource.model.SAnime
|
|||||||
import eu.kanade.tachiyomi.animesource.model.SEpisode
|
import eu.kanade.tachiyomi.animesource.model.SEpisode
|
||||||
import eu.kanade.tachiyomi.animesource.model.Video
|
import eu.kanade.tachiyomi.animesource.model.Video
|
||||||
import eu.kanade.tachiyomi.animesource.online.ParsedAnimeHttpSource
|
import eu.kanade.tachiyomi.animesource.online.ParsedAnimeHttpSource
|
||||||
|
import eu.kanade.tachiyomi.lib.googledriveextractor.GoogleDriveExtractor
|
||||||
import eu.kanade.tachiyomi.network.GET
|
import eu.kanade.tachiyomi.network.GET
|
||||||
import eu.kanade.tachiyomi.network.POST
|
import eu.kanade.tachiyomi.network.POST
|
||||||
import eu.kanade.tachiyomi.util.asJsoup
|
import eu.kanade.tachiyomi.util.asJsoup
|
||||||
|
@ -1,98 +0,0 @@
|
|||||||
package eu.kanade.tachiyomi.animeextension.en.kayoanime.extractors
|
|
||||||
|
|
||||||
import eu.kanade.tachiyomi.animesource.model.Video
|
|
||||||
import eu.kanade.tachiyomi.network.GET
|
|
||||||
import eu.kanade.tachiyomi.network.POST
|
|
||||||
import eu.kanade.tachiyomi.util.asJsoup
|
|
||||||
import okhttp3.Headers
|
|
||||||
import okhttp3.HttpUrl.Companion.toHttpUrl
|
|
||||||
import okhttp3.MediaType.Companion.toMediaType
|
|
||||||
import okhttp3.OkHttpClient
|
|
||||||
import okhttp3.RequestBody.Companion.toRequestBody
|
|
||||||
|
|
||||||
class GoogleDriveExtractor(private val client: OkHttpClient, private val headers: Headers) {
|
|
||||||
// Needs to be the form of `https://drive.google.com/uc?id=GOOGLEDRIVEITEMID`
|
|
||||||
fun videosFromUrl(itemUrl: String, videoName: String = "Video"): List<Video> {
|
|
||||||
val itemHeaders = headers.newBuilder()
|
|
||||||
.add("Accept", "*/*")
|
|
||||||
.add("Accept-Language", "en-US,en;q=0.5")
|
|
||||||
.add("Connection", "keep-alive")
|
|
||||||
.add("Cookie", getCookie(itemUrl))
|
|
||||||
.add("Host", "drive.google.com")
|
|
||||||
.build()
|
|
||||||
|
|
||||||
val itemResponse = client.newCall(
|
|
||||||
GET(itemUrl, headers = itemHeaders),
|
|
||||||
).execute()
|
|
||||||
|
|
||||||
val noRedirectClient = OkHttpClient().newBuilder().followRedirects(false).build()
|
|
||||||
val document = itemResponse.asJsoup()
|
|
||||||
|
|
||||||
val itemSize = document.selectFirst("span.uc-name-size")?.let {
|
|
||||||
" ${it.ownText().trim()} "
|
|
||||||
} ?: ""
|
|
||||||
val url = document.selectFirst("form#download-form")?.attr("action") ?: return emptyList()
|
|
||||||
val redirectHeaders = headers.newBuilder()
|
|
||||||
.add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8")
|
|
||||||
.add("Connection", "keep-alive")
|
|
||||||
.add("Content-Length", "0")
|
|
||||||
.add("Content-Type", "application/x-www-form-urlencoded")
|
|
||||||
.add("Cookie", getCookie(url))
|
|
||||||
.add("Host", "drive.google.com")
|
|
||||||
.add("Origin", "https://drive.google.com")
|
|
||||||
.add("Referer", url.substringBeforeLast("&at="))
|
|
||||||
.build()
|
|
||||||
|
|
||||||
val response = noRedirectClient.newCall(
|
|
||||||
POST(url, headers = redirectHeaders, body = "".toRequestBody("application/x-www-form-urlencoded".toMediaType())),
|
|
||||||
).execute()
|
|
||||||
val redirected = response.headers["location"] ?: return listOf(Video(url, videoName + itemSize, url))
|
|
||||||
|
|
||||||
val redirectedHeaders = headers.newBuilder()
|
|
||||||
.add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8")
|
|
||||||
.add("Connection", "keep-alive")
|
|
||||||
.add("Host", redirected.toHttpUrl().host)
|
|
||||||
.add("Referer", "https://drive.google.com/")
|
|
||||||
.build()
|
|
||||||
|
|
||||||
val redirectedResponseHeaders = noRedirectClient.newCall(
|
|
||||||
GET(redirected, headers = redirectedHeaders),
|
|
||||||
).execute().headers
|
|
||||||
val authCookie = redirectedResponseHeaders.firstOrNull {
|
|
||||||
it.first == "set-cookie" && it.second.startsWith("AUTH_")
|
|
||||||
}?.second?.substringBefore(";") ?: return listOf(Video(url, videoName + itemSize, url))
|
|
||||||
val newRedirected = redirectedResponseHeaders["location"] ?: return listOf(Video(redirected, videoName + itemSize, redirected))
|
|
||||||
|
|
||||||
val googleDriveRedirectHeaders = headers.newBuilder()
|
|
||||||
.add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8")
|
|
||||||
.add("Connection", "keep-alive")
|
|
||||||
.add("Cookie", getCookie(newRedirected))
|
|
||||||
.add("Host", "drive.google.com")
|
|
||||||
.add("Referer", "https://drive.google.com/")
|
|
||||||
.build()
|
|
||||||
val googleDriveRedirectUrl = noRedirectClient.newCall(
|
|
||||||
GET(newRedirected, headers = googleDriveRedirectHeaders),
|
|
||||||
).execute().headers["location"]!!
|
|
||||||
|
|
||||||
val videoHeaders = headers.newBuilder()
|
|
||||||
.add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8")
|
|
||||||
.add("Connection", "keep-alive")
|
|
||||||
.add("Cookie", authCookie)
|
|
||||||
.add("Host", googleDriveRedirectUrl.toHttpUrl().host)
|
|
||||||
.add("Referer", "https://drive.google.com/")
|
|
||||||
.build()
|
|
||||||
|
|
||||||
return listOf(
|
|
||||||
Video(googleDriveRedirectUrl, videoName + itemSize, googleDriveRedirectUrl, headers = videoHeaders),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun getCookie(url: String): String {
|
|
||||||
val cookieList = client.cookieJar.loadForRequest(url.toHttpUrl())
|
|
||||||
return if (cookieList.isNotEmpty()) {
|
|
||||||
cookieList.joinToString("; ") { "${it.name}=${it.value}" }
|
|
||||||
} else {
|
|
||||||
""
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -10,4 +10,8 @@ ext {
|
|||||||
libVersion = '13'
|
libVersion = '13'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dependencies {
|
||||||
|
implementation(project(':lib-googledrive-extractor'))
|
||||||
|
}
|
||||||
|
|
||||||
apply from: "$rootDir/common.gradle"
|
apply from: "$rootDir/common.gradle"
|
||||||
|
@ -7,7 +7,6 @@ import androidx.preference.EditTextPreference
|
|||||||
import androidx.preference.PreferenceScreen
|
import androidx.preference.PreferenceScreen
|
||||||
import androidx.preference.SwitchPreferenceCompat
|
import androidx.preference.SwitchPreferenceCompat
|
||||||
import eu.kanade.tachiyomi.AppInfo
|
import eu.kanade.tachiyomi.AppInfo
|
||||||
import eu.kanade.tachiyomi.animeextension.en.ripcrabbyanime.extractors.GoogleDriveExtractor
|
|
||||||
import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource
|
import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource
|
||||||
import eu.kanade.tachiyomi.animesource.model.AnimeFilter
|
import eu.kanade.tachiyomi.animesource.model.AnimeFilter
|
||||||
import eu.kanade.tachiyomi.animesource.model.AnimeFilterList
|
import eu.kanade.tachiyomi.animesource.model.AnimeFilterList
|
||||||
@ -16,6 +15,7 @@ import eu.kanade.tachiyomi.animesource.model.SAnime
|
|||||||
import eu.kanade.tachiyomi.animesource.model.SEpisode
|
import eu.kanade.tachiyomi.animesource.model.SEpisode
|
||||||
import eu.kanade.tachiyomi.animesource.model.Video
|
import eu.kanade.tachiyomi.animesource.model.Video
|
||||||
import eu.kanade.tachiyomi.animesource.online.ParsedAnimeHttpSource
|
import eu.kanade.tachiyomi.animesource.online.ParsedAnimeHttpSource
|
||||||
|
import eu.kanade.tachiyomi.lib.googledriveextractor.GoogleDriveExtractor
|
||||||
import eu.kanade.tachiyomi.network.GET
|
import eu.kanade.tachiyomi.network.GET
|
||||||
import eu.kanade.tachiyomi.network.POST
|
import eu.kanade.tachiyomi.network.POST
|
||||||
import eu.kanade.tachiyomi.util.asJsoup
|
import eu.kanade.tachiyomi.util.asJsoup
|
||||||
|
@ -1,98 +0,0 @@
|
|||||||
package eu.kanade.tachiyomi.animeextension.en.ripcrabbyanime.extractors
|
|
||||||
|
|
||||||
import eu.kanade.tachiyomi.animesource.model.Video
|
|
||||||
import eu.kanade.tachiyomi.network.GET
|
|
||||||
import eu.kanade.tachiyomi.network.POST
|
|
||||||
import eu.kanade.tachiyomi.util.asJsoup
|
|
||||||
import okhttp3.Headers
|
|
||||||
import okhttp3.HttpUrl.Companion.toHttpUrl
|
|
||||||
import okhttp3.MediaType.Companion.toMediaType
|
|
||||||
import okhttp3.OkHttpClient
|
|
||||||
import okhttp3.RequestBody.Companion.toRequestBody
|
|
||||||
|
|
||||||
class GoogleDriveExtractor(private val client: OkHttpClient, private val headers: Headers) {
|
|
||||||
// Needs to be the form of `https://drive.google.com/uc?id=GOOGLEDRIVEITEMID`
|
|
||||||
fun videosFromUrl(itemUrl: String, videoName: String = "Video"): List<Video> {
|
|
||||||
val itemHeaders = headers.newBuilder()
|
|
||||||
.add("Accept", "*/*")
|
|
||||||
.add("Accept-Language", "en-US,en;q=0.5")
|
|
||||||
.add("Connection", "keep-alive")
|
|
||||||
.add("Cookie", getCookie(itemUrl))
|
|
||||||
.add("Host", "drive.google.com")
|
|
||||||
.build()
|
|
||||||
|
|
||||||
val itemResponse = client.newCall(
|
|
||||||
GET(itemUrl, headers = itemHeaders),
|
|
||||||
).execute()
|
|
||||||
|
|
||||||
val noRedirectClient = OkHttpClient().newBuilder().followRedirects(false).build()
|
|
||||||
val document = itemResponse.asJsoup()
|
|
||||||
|
|
||||||
val itemSize = document.selectFirst("span.uc-name-size")?.let {
|
|
||||||
" ${it.ownText().trim()} "
|
|
||||||
} ?: ""
|
|
||||||
val url = document.selectFirst("form#download-form")?.attr("action") ?: return emptyList()
|
|
||||||
val redirectHeaders = headers.newBuilder()
|
|
||||||
.add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8")
|
|
||||||
.add("Connection", "keep-alive")
|
|
||||||
.add("Content-Length", "0")
|
|
||||||
.add("Content-Type", "application/x-www-form-urlencoded")
|
|
||||||
.add("Cookie", getCookie(url))
|
|
||||||
.add("Host", "drive.google.com")
|
|
||||||
.add("Origin", "https://drive.google.com")
|
|
||||||
.add("Referer", url.substringBeforeLast("&at="))
|
|
||||||
.build()
|
|
||||||
|
|
||||||
val response = noRedirectClient.newCall(
|
|
||||||
POST(url, headers = redirectHeaders, body = "".toRequestBody("application/x-www-form-urlencoded".toMediaType())),
|
|
||||||
).execute()
|
|
||||||
val redirected = response.headers["location"] ?: return listOf(Video(url, videoName + itemSize, url))
|
|
||||||
|
|
||||||
val redirectedHeaders = headers.newBuilder()
|
|
||||||
.add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8")
|
|
||||||
.add("Connection", "keep-alive")
|
|
||||||
.add("Host", redirected.toHttpUrl().host)
|
|
||||||
.add("Referer", "https://drive.google.com/")
|
|
||||||
.build()
|
|
||||||
|
|
||||||
val redirectedResponseHeaders = noRedirectClient.newCall(
|
|
||||||
GET(redirected, headers = redirectedHeaders),
|
|
||||||
).execute().headers
|
|
||||||
val authCookie = redirectedResponseHeaders.firstOrNull {
|
|
||||||
it.first == "set-cookie" && it.second.startsWith("AUTH_")
|
|
||||||
}?.second?.substringBefore(";") ?: return listOf(Video(url, videoName + itemSize, url))
|
|
||||||
val newRedirected = redirectedResponseHeaders["location"] ?: return listOf(Video(redirected, videoName + itemSize, redirected))
|
|
||||||
|
|
||||||
val googleDriveRedirectHeaders = headers.newBuilder()
|
|
||||||
.add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8")
|
|
||||||
.add("Connection", "keep-alive")
|
|
||||||
.add("Cookie", getCookie(newRedirected))
|
|
||||||
.add("Host", "drive.google.com")
|
|
||||||
.add("Referer", "https://drive.google.com/")
|
|
||||||
.build()
|
|
||||||
val googleDriveRedirectUrl = noRedirectClient.newCall(
|
|
||||||
GET(newRedirected, headers = googleDriveRedirectHeaders),
|
|
||||||
).execute().headers["location"]!!
|
|
||||||
|
|
||||||
val videoHeaders = headers.newBuilder()
|
|
||||||
.add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8")
|
|
||||||
.add("Connection", "keep-alive")
|
|
||||||
.add("Cookie", authCookie)
|
|
||||||
.add("Host", googleDriveRedirectUrl.toHttpUrl().host)
|
|
||||||
.add("Referer", "https://drive.google.com/")
|
|
||||||
.build()
|
|
||||||
|
|
||||||
return listOf(
|
|
||||||
Video(googleDriveRedirectUrl, videoName + itemSize, googleDriveRedirectUrl, headers = videoHeaders),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun getCookie(url: String): String {
|
|
||||||
val cookieList = client.cookieJar.loadForRequest(url.toHttpUrl())
|
|
||||||
return if (cookieList.isNotEmpty()) {
|
|
||||||
cookieList.joinToString("; ") { "${it.name}=${it.value}" }
|
|
||||||
} else {
|
|
||||||
""
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
@ -5,6 +5,7 @@ plugins {
|
|||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
implementation(project(':lib-googledrive-extractor'))
|
||||||
implementation(project(':lib-filemoon-extractor'))
|
implementation(project(':lib-filemoon-extractor'))
|
||||||
implementation(project(':lib-mp4upload-extractor'))
|
implementation(project(':lib-mp4upload-extractor'))
|
||||||
implementation(project(":lib-cryptoaes"))
|
implementation(project(":lib-cryptoaes"))
|
||||||
|
@ -8,7 +8,6 @@ import androidx.preference.MultiSelectListPreference
|
|||||||
import androidx.preference.PreferenceScreen
|
import androidx.preference.PreferenceScreen
|
||||||
import eu.kanade.tachiyomi.animeextension.tr.turkanime.extractors.AlucardExtractor
|
import eu.kanade.tachiyomi.animeextension.tr.turkanime.extractors.AlucardExtractor
|
||||||
import eu.kanade.tachiyomi.animeextension.tr.turkanime.extractors.EmbedgramExtractor
|
import eu.kanade.tachiyomi.animeextension.tr.turkanime.extractors.EmbedgramExtractor
|
||||||
import eu.kanade.tachiyomi.animeextension.tr.turkanime.extractors.GoogleDriveExtractor
|
|
||||||
import eu.kanade.tachiyomi.animeextension.tr.turkanime.extractors.MVidooExtractor
|
import eu.kanade.tachiyomi.animeextension.tr.turkanime.extractors.MVidooExtractor
|
||||||
import eu.kanade.tachiyomi.animeextension.tr.turkanime.extractors.MailRuExtractor
|
import eu.kanade.tachiyomi.animeextension.tr.turkanime.extractors.MailRuExtractor
|
||||||
import eu.kanade.tachiyomi.animeextension.tr.turkanime.extractors.MytvExtractor
|
import eu.kanade.tachiyomi.animeextension.tr.turkanime.extractors.MytvExtractor
|
||||||
@ -29,6 +28,7 @@ import eu.kanade.tachiyomi.animesource.online.ParsedAnimeHttpSource
|
|||||||
import eu.kanade.tachiyomi.lib.cryptoaes.CryptoAES
|
import eu.kanade.tachiyomi.lib.cryptoaes.CryptoAES
|
||||||
import eu.kanade.tachiyomi.lib.doodextractor.DoodExtractor
|
import eu.kanade.tachiyomi.lib.doodextractor.DoodExtractor
|
||||||
import eu.kanade.tachiyomi.lib.filemoonextractor.FilemoonExtractor
|
import eu.kanade.tachiyomi.lib.filemoonextractor.FilemoonExtractor
|
||||||
|
import eu.kanade.tachiyomi.lib.googledriveextractor.GoogleDriveExtractor
|
||||||
import eu.kanade.tachiyomi.lib.mp4uploadextractor.Mp4uploadExtractor
|
import eu.kanade.tachiyomi.lib.mp4uploadextractor.Mp4uploadExtractor
|
||||||
import eu.kanade.tachiyomi.lib.okruextractor.OkruExtractor
|
import eu.kanade.tachiyomi.lib.okruextractor.OkruExtractor
|
||||||
import eu.kanade.tachiyomi.lib.sendvidextractor.SendvidExtractor
|
import eu.kanade.tachiyomi.lib.sendvidextractor.SendvidExtractor
|
||||||
|
@ -1,98 +0,0 @@
|
|||||||
package eu.kanade.tachiyomi.animeextension.tr.turkanime.extractors
|
|
||||||
|
|
||||||
import eu.kanade.tachiyomi.animesource.model.Video
|
|
||||||
import eu.kanade.tachiyomi.network.GET
|
|
||||||
import eu.kanade.tachiyomi.network.POST
|
|
||||||
import eu.kanade.tachiyomi.util.asJsoup
|
|
||||||
import okhttp3.Headers
|
|
||||||
import okhttp3.HttpUrl.Companion.toHttpUrl
|
|
||||||
import okhttp3.MediaType.Companion.toMediaType
|
|
||||||
import okhttp3.OkHttpClient
|
|
||||||
import okhttp3.RequestBody.Companion.toRequestBody
|
|
||||||
|
|
||||||
class GoogleDriveExtractor(private val client: OkHttpClient, private val headers: Headers) {
|
|
||||||
// Needs to be the form of `https://drive.google.com/uc?id=GOOGLEDRIVEITEMID`
|
|
||||||
fun videosFromUrl(itemUrl: String, videoName: String = "Video"): List<Video> {
|
|
||||||
val itemHeaders = headers.newBuilder()
|
|
||||||
.add("Accept", "*/*")
|
|
||||||
.add("Accept-Language", "en-US,en;q=0.5")
|
|
||||||
.add("Connection", "keep-alive")
|
|
||||||
.add("Cookie", getCookie(itemUrl))
|
|
||||||
.add("Host", "drive.google.com")
|
|
||||||
.build()
|
|
||||||
|
|
||||||
val itemResponse = client.newCall(
|
|
||||||
GET(itemUrl, headers = itemHeaders),
|
|
||||||
).execute()
|
|
||||||
|
|
||||||
val noRedirectClient = OkHttpClient().newBuilder().followRedirects(false).build()
|
|
||||||
val document = itemResponse.asJsoup()
|
|
||||||
|
|
||||||
val itemSize = document.selectFirst("span.uc-name-size")?.let {
|
|
||||||
" ${it.ownText().trim()} "
|
|
||||||
} ?: ""
|
|
||||||
val url = document.selectFirst("form#download-form")?.attr("action") ?: return emptyList()
|
|
||||||
val redirectHeaders = headers.newBuilder()
|
|
||||||
.add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8")
|
|
||||||
.add("Connection", "keep-alive")
|
|
||||||
.add("Content-Length", "0")
|
|
||||||
.add("Content-Type", "application/x-www-form-urlencoded")
|
|
||||||
.add("Cookie", getCookie(url))
|
|
||||||
.add("Host", "drive.google.com")
|
|
||||||
.add("Origin", "https://drive.google.com")
|
|
||||||
.add("Referer", url.substringBeforeLast("&at="))
|
|
||||||
.build()
|
|
||||||
|
|
||||||
val response = noRedirectClient.newCall(
|
|
||||||
POST(url, headers = redirectHeaders, body = "".toRequestBody("application/x-www-form-urlencoded".toMediaType())),
|
|
||||||
).execute()
|
|
||||||
val redirected = response.headers["location"] ?: return listOf(Video(url, videoName + itemSize, url))
|
|
||||||
|
|
||||||
val redirectedHeaders = headers.newBuilder()
|
|
||||||
.add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8")
|
|
||||||
.add("Connection", "keep-alive")
|
|
||||||
.add("Host", redirected.toHttpUrl().host)
|
|
||||||
.add("Referer", "https://drive.google.com/")
|
|
||||||
.build()
|
|
||||||
|
|
||||||
val redirectedResponseHeaders = noRedirectClient.newCall(
|
|
||||||
GET(redirected, headers = redirectedHeaders),
|
|
||||||
).execute().headers
|
|
||||||
val authCookie = redirectedResponseHeaders.firstOrNull {
|
|
||||||
it.first == "set-cookie" && it.second.startsWith("AUTH_")
|
|
||||||
}?.second?.substringBefore(";") ?: return listOf(Video(url, videoName + itemSize, url))
|
|
||||||
val newRedirected = redirectedResponseHeaders["location"] ?: return listOf(Video(redirected, videoName + itemSize, redirected))
|
|
||||||
|
|
||||||
val googleDriveRedirectHeaders = headers.newBuilder()
|
|
||||||
.add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8")
|
|
||||||
.add("Connection", "keep-alive")
|
|
||||||
.add("Cookie", getCookie(newRedirected))
|
|
||||||
.add("Host", "drive.google.com")
|
|
||||||
.add("Referer", "https://drive.google.com/")
|
|
||||||
.build()
|
|
||||||
val googleDriveRedirectUrl = noRedirectClient.newCall(
|
|
||||||
GET(newRedirected, headers = googleDriveRedirectHeaders),
|
|
||||||
).execute().headers["location"]!!
|
|
||||||
|
|
||||||
val videoHeaders = headers.newBuilder()
|
|
||||||
.add("Accept", "text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8")
|
|
||||||
.add("Connection", "keep-alive")
|
|
||||||
.add("Cookie", authCookie)
|
|
||||||
.add("Host", googleDriveRedirectUrl.toHttpUrl().host)
|
|
||||||
.add("Referer", "https://drive.google.com/")
|
|
||||||
.build()
|
|
||||||
|
|
||||||
return listOf(
|
|
||||||
Video(googleDriveRedirectUrl, videoName + itemSize, googleDriveRedirectUrl, headers = videoHeaders),
|
|
||||||
)
|
|
||||||
}
|
|
||||||
|
|
||||||
private fun getCookie(url: String): String {
|
|
||||||
val cookieList = client.cookieJar.loadForRequest(url.toHttpUrl())
|
|
||||||
return if (cookieList.isNotEmpty()) {
|
|
||||||
cookieList.joinToString("; ") { "${it.name}=${it.value}" }
|
|
||||||
} else {
|
|
||||||
""
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
Reference in New Issue
Block a user