diff --git a/src/all/googledriveindex/build.gradle b/src/all/googledriveindex/build.gradle index 1e1462c4e..596b4b0af 100644 --- a/src/all/googledriveindex/build.gradle +++ b/src/all/googledriveindex/build.gradle @@ -6,7 +6,7 @@ ext { extName = 'GoogleDriveIndex' pkgNameSuffix = 'all.googledriveindex' extClass = '.GoogleDriveIndex' - extVersionCode = 2 + extVersionCode = 3 libVersion = '13' } diff --git a/src/all/googledriveindex/src/eu/kanade/tachiyomi/animeextension/all/googledriveindex/DataModel.kt b/src/all/googledriveindex/src/eu/kanade/tachiyomi/animeextension/all/googledriveindex/DataModel.kt index 50bf5a804..3fc2e48e0 100644 --- a/src/all/googledriveindex/src/eu/kanade/tachiyomi/animeextension/all/googledriveindex/DataModel.kt +++ b/src/all/googledriveindex/src/eu/kanade/tachiyomi/animeextension/all/googledriveindex/DataModel.kt @@ -36,3 +36,13 @@ data class IdUrl( val referer: 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? = null, + val status: String? = null, +) diff --git a/src/all/googledriveindex/src/eu/kanade/tachiyomi/animeextension/all/googledriveindex/GoogleDriveIndex.kt b/src/all/googledriveindex/src/eu/kanade/tachiyomi/animeextension/all/googledriveindex/GoogleDriveIndex.kt index d7010b19d..950525c65 100644 --- a/src/all/googledriveindex/src/eu/kanade/tachiyomi/animeextension/all/googledriveindex/GoogleDriveIndex.kt +++ b/src/all/googledriveindex/src/eu/kanade/tachiyomi/animeextension/all/googledriveindex/GoogleDriveIndex.kt @@ -214,6 +214,78 @@ class GoogleDriveIndex : ConfigurableAnimeSource, AnimeHttpSource() { // =========================== Anime Details ============================ override fun fetchAnimeDetails(anime: SAnime): Observable { + val parsed = json.decodeFromString(anime.url) + val newParsed = if (parsed.type != "search") { + parsed + } else { + val idParsed = json.decodeFromString(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(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) + 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) } @@ -437,6 +509,7 @@ class GoogleDriveIndex : ConfigurableAnimeSource, AnimeHttpSource() { if (item.mimeType.endsWith("folder")) { val anime = SAnime.create() anime.title = item.name.trimInfo() + anime.thumbnail_url = "" if (isSearch) { anime.setUrlWithoutDomain( @@ -466,6 +539,7 @@ class GoogleDriveIndex : ConfigurableAnimeSource, AnimeHttpSource() { ) { val anime = SAnime.create() anime.title = item.name.trimInfo() + anime.thumbnail_url = "" if (isSearch) { anime.setUrlWithoutDomain(