GoogleDriveIndex: Add support for info & remove accidental ddos (#1466)
This commit is contained in:
@ -6,7 +6,7 @@ ext {
|
|||||||
extName = 'GoogleDriveIndex'
|
extName = 'GoogleDriveIndex'
|
||||||
pkgNameSuffix = 'all.googledriveindex'
|
pkgNameSuffix = 'all.googledriveindex'
|
||||||
extClass = '.GoogleDriveIndex'
|
extClass = '.GoogleDriveIndex'
|
||||||
extVersionCode = 2
|
extVersionCode = 3
|
||||||
libVersion = '13'
|
libVersion = '13'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -36,3 +36,13 @@ data class IdUrl(
|
|||||||
val referer: String,
|
val referer: String,
|
||||||
val type: String,
|
val type: String,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
@Serializable
|
||||||
|
data class Details(
|
||||||
|
val title: String? = null,
|
||||||
|
val author: String? = null,
|
||||||
|
val artist: String? = null,
|
||||||
|
val description: String? = null,
|
||||||
|
val genre: List<String>? = null,
|
||||||
|
val status: String? = null,
|
||||||
|
)
|
||||||
|
@ -214,6 +214,78 @@ class GoogleDriveIndex : ConfigurableAnimeSource, AnimeHttpSource() {
|
|||||||
// =========================== Anime Details ============================
|
// =========================== Anime Details ============================
|
||||||
|
|
||||||
override fun fetchAnimeDetails(anime: SAnime): Observable<SAnime> {
|
override fun fetchAnimeDetails(anime: SAnime): Observable<SAnime> {
|
||||||
|
val parsed = json.decodeFromString<LinkData>(anime.url)
|
||||||
|
val newParsed = if (parsed.type != "search") {
|
||||||
|
parsed
|
||||||
|
} else {
|
||||||
|
val idParsed = json.decodeFromString<IdUrl>(parsed.url)
|
||||||
|
val id2pathHeaders = headers.newBuilder()
|
||||||
|
.add("Accept", "*/*")
|
||||||
|
.add("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")
|
||||||
|
.add("Host", idParsed.url.toHttpUrl().host)
|
||||||
|
.add("Origin", "https://${idParsed.url.toHttpUrl().host}")
|
||||||
|
.add("Referer", URLEncoder.encode(idParsed.referer, "UTF-8"))
|
||||||
|
.add("X-Requested-With", "XMLHttpRequest")
|
||||||
|
.build()
|
||||||
|
|
||||||
|
val postBody = "id=${idParsed.id}".toRequestBody("application/x-www-form-urlencoded".toMediaType())
|
||||||
|
val slug = client.newCall(
|
||||||
|
POST(idParsed.url + "id2path", body = postBody, headers = id2pathHeaders),
|
||||||
|
).execute().body.string()
|
||||||
|
|
||||||
|
LinkData(
|
||||||
|
idParsed.type,
|
||||||
|
idParsed.url + slug,
|
||||||
|
parsed.info,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (newParsed.type == "single") {
|
||||||
|
return Observable.just(anime)
|
||||||
|
}
|
||||||
|
|
||||||
|
var newToken: String? = ""
|
||||||
|
var newPageIndex = 0
|
||||||
|
while (newToken != null) {
|
||||||
|
val popHeaders = headers.newBuilder()
|
||||||
|
.add("Accept", "*/*")
|
||||||
|
.add("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8")
|
||||||
|
.add("Host", newParsed.url.toHttpUrl().host)
|
||||||
|
.add("Origin", "https://${newParsed.url.toHttpUrl().host}")
|
||||||
|
.add("Referer", URLEncoder.encode(newParsed.url, "UTF-8"))
|
||||||
|
.add("X-Requested-With", "XMLHttpRequest")
|
||||||
|
.build()
|
||||||
|
|
||||||
|
val popBody = "password=&page_token=$newToken&page_index=$newPageIndex".toRequestBody("application/x-www-form-urlencoded".toMediaType())
|
||||||
|
|
||||||
|
val parsedBody = client.newCall(
|
||||||
|
POST(newParsed.url, body = popBody, headers = popHeaders),
|
||||||
|
).execute().body.string().decrypt()
|
||||||
|
val parsed = json.decodeFromString<ResponseData>(parsedBody)
|
||||||
|
|
||||||
|
parsed.data.files.forEach { item ->
|
||||||
|
if (item.mimeType.startsWith("image/") && item.name.startsWith("cover", true)) {
|
||||||
|
anime.thumbnail_url = joinUrl(newParsed.url, item.name)
|
||||||
|
}
|
||||||
|
|
||||||
|
if (item.name.equals("details.json", true)) {
|
||||||
|
val details = client.newCall(
|
||||||
|
GET(joinUrl(newParsed.url, item.name)),
|
||||||
|
).execute().body.string()
|
||||||
|
val detailsParsed = json.decodeFromString<Details>(details)
|
||||||
|
detailsParsed.title?.let { anime.title = it }
|
||||||
|
detailsParsed.author?.let { anime.author = it }
|
||||||
|
detailsParsed.artist?.let { anime.artist = it }
|
||||||
|
detailsParsed.description?.let { anime.description = it }
|
||||||
|
detailsParsed.genre?.let { anime.genre = it.joinToString(", ") }
|
||||||
|
detailsParsed.status?.let { anime.status = it.toIntOrNull() ?: SAnime.UNKNOWN }
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
newToken = parsed.nextPageToken
|
||||||
|
newPageIndex += 1
|
||||||
|
}
|
||||||
|
|
||||||
return Observable.just(anime)
|
return Observable.just(anime)
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -437,6 +509,7 @@ class GoogleDriveIndex : ConfigurableAnimeSource, AnimeHttpSource() {
|
|||||||
if (item.mimeType.endsWith("folder")) {
|
if (item.mimeType.endsWith("folder")) {
|
||||||
val anime = SAnime.create()
|
val anime = SAnime.create()
|
||||||
anime.title = item.name.trimInfo()
|
anime.title = item.name.trimInfo()
|
||||||
|
anime.thumbnail_url = ""
|
||||||
|
|
||||||
if (isSearch) {
|
if (isSearch) {
|
||||||
anime.setUrlWithoutDomain(
|
anime.setUrlWithoutDomain(
|
||||||
@ -466,6 +539,7 @@ class GoogleDriveIndex : ConfigurableAnimeSource, AnimeHttpSource() {
|
|||||||
) {
|
) {
|
||||||
val anime = SAnime.create()
|
val anime = SAnime.create()
|
||||||
anime.title = item.name.trimInfo()
|
anime.title = item.name.trimInfo()
|
||||||
|
anime.thumbnail_url = ""
|
||||||
|
|
||||||
if (isSearch) {
|
if (isSearch) {
|
||||||
anime.setUrlWithoutDomain(
|
anime.setUrlWithoutDomain(
|
||||||
|
Reference in New Issue
Block a user