mirror of
https://github.com/hexated/cloudstream-extensions-hexated.git
synced 2024-08-15 00:03:22 +00:00
Anichi: added lib/sync support
This commit is contained in:
parent
017d861b00
commit
8a61d0891e
5 changed files with 64 additions and 3 deletions
|
@ -1,7 +1,7 @@
|
||||||
import org.jetbrains.kotlin.konan.properties.Properties
|
import org.jetbrains.kotlin.konan.properties.Properties
|
||||||
|
|
||||||
// use an integer for version numbers
|
// use an integer for version numbers
|
||||||
version = 7
|
version = 8
|
||||||
|
|
||||||
android {
|
android {
|
||||||
defaultConfig {
|
defaultConfig {
|
||||||
|
|
|
@ -7,6 +7,7 @@ import com.lagradost.cloudstream3.LoadResponse.Companion.addActors
|
||||||
import com.lagradost.cloudstream3.LoadResponse.Companion.addAniListId
|
import com.lagradost.cloudstream3.LoadResponse.Companion.addAniListId
|
||||||
import com.lagradost.cloudstream3.LoadResponse.Companion.addMalId
|
import com.lagradost.cloudstream3.LoadResponse.Companion.addMalId
|
||||||
import com.lagradost.cloudstream3.LoadResponse.Companion.addTrailer
|
import com.lagradost.cloudstream3.LoadResponse.Companion.addTrailer
|
||||||
|
import com.lagradost.cloudstream3.syncproviders.SyncIdName
|
||||||
import com.lagradost.cloudstream3.utils.*
|
import com.lagradost.cloudstream3.utils.*
|
||||||
import com.lagradost.cloudstream3.utils.AppUtils.parseJson
|
import com.lagradost.cloudstream3.utils.AppUtils.parseJson
|
||||||
import com.lagradost.nicehttp.RequestBodyTypes
|
import com.lagradost.nicehttp.RequestBodyTypes
|
||||||
|
@ -27,6 +28,7 @@ open class Anichi : MainAPI() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override val supportedSyncNames = setOf(SyncIdName.Anilist, SyncIdName.MyAnimeList)
|
||||||
override val supportedTypes = setOf(TvType.Anime, TvType.AnimeMovie)
|
override val supportedTypes = setOf(TvType.Anime, TvType.AnimeMovie)
|
||||||
|
|
||||||
private val popularTitle = "Popular"
|
private val popularTitle = "Popular"
|
||||||
|
@ -110,6 +112,29 @@ open class Anichi : MainAPI() {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
override suspend fun getLoadUrl(name: SyncIdName, id: String): String? {
|
||||||
|
val syncId = id.split("/").last()
|
||||||
|
val malId = if (name == SyncIdName.MyAnimeList) {
|
||||||
|
syncId
|
||||||
|
} else {
|
||||||
|
aniToMal(syncId)
|
||||||
|
}
|
||||||
|
|
||||||
|
val media = app.get("$jikanApi/anime/$malId").parsedSafe<JikanResponse>()?.data
|
||||||
|
val link =
|
||||||
|
"""$apiUrl?variables={"search":{"allowAdult":false,"allowUnknown":false,"query":"${media?.title}"},"limit":26,"page":1,"translationType":"sub","countryOrigin":"ALL"}&extensions={"persistedQuery":{"version":1,"sha256Hash":"$mainHash"}}"""
|
||||||
|
val res = app.get(
|
||||||
|
link,
|
||||||
|
headers = headers
|
||||||
|
).parsedSafe<AnichiQuery>()?.data?.shows?.edges
|
||||||
|
return res?.find {
|
||||||
|
(it.name.equals(media?.title, true) || it.englishName.equals(
|
||||||
|
media?.title_english,
|
||||||
|
true
|
||||||
|
) || it.nativeName.equals(media?.title_japanese, true)) && it.airedStart?.year == media?.year
|
||||||
|
}?.Id
|
||||||
|
}
|
||||||
|
|
||||||
override suspend fun load(url: String): LoadResponse? {
|
override suspend fun load(url: String): LoadResponse? {
|
||||||
|
|
||||||
val id = url.substringAfterLast("/")
|
val id = url.substringAfterLast("/")
|
||||||
|
@ -218,6 +243,8 @@ open class Anichi : MainAPI() {
|
||||||
const val serverUrl = BuildConfig.ANICHI_SERVER
|
const val serverUrl = BuildConfig.ANICHI_SERVER
|
||||||
const val apiEndPoint = BuildConfig.ANICHI_ENDPOINT
|
const val apiEndPoint = BuildConfig.ANICHI_ENDPOINT
|
||||||
|
|
||||||
|
const val anilistApi = "https://graphql.anilist.co"
|
||||||
|
const val jikanApi = "https://api.jikan.moe/v4"
|
||||||
const val marinHost = "https://marin.moe"
|
const val marinHost = "https://marin.moe"
|
||||||
|
|
||||||
private const val mainHash = "e42a4466d984b2c0a2cecae5dd13aa68867f634b16ee0f17b380047d14482406"
|
private const val mainHash = "e42a4466d984b2c0a2cecae5dd13aa68867f634b16ee0f17b380047d14482406"
|
||||||
|
|
|
@ -69,7 +69,7 @@ object AnichiExtractors : Anichi() {
|
||||||
links.forEach { server ->
|
links.forEach { server ->
|
||||||
val host = server.link.getHost()
|
val host = server.link.getHost()
|
||||||
when {
|
when {
|
||||||
source.sourceName == "Default" -> {
|
source.sourceName?.contains("Default") == true -> {
|
||||||
if (server.resolutionStr == "SUB" || server.resolutionStr == "Alt vo_SUB") {
|
if (server.resolutionStr == "SUB" || server.resolutionStr == "Alt vo_SUB") {
|
||||||
getM3u8Qualities(
|
getM3u8Qualities(
|
||||||
server.link,
|
server.link,
|
||||||
|
|
|
@ -9,6 +9,31 @@ data class AnichiLoadData(
|
||||||
val idMal: Int? = null,
|
val idMal: Int? = null,
|
||||||
)
|
)
|
||||||
|
|
||||||
|
data class JikanData(
|
||||||
|
@JsonProperty("title") val title: String? = null,
|
||||||
|
@JsonProperty("title_english") val title_english: String? = null,
|
||||||
|
@JsonProperty("title_japanese") val title_japanese: String? = null,
|
||||||
|
@JsonProperty("year") val year: Int? = null,
|
||||||
|
@JsonProperty("season") val season: String? = null,
|
||||||
|
@JsonProperty("type") val type: String? = null,
|
||||||
|
)
|
||||||
|
|
||||||
|
data class JikanResponse(
|
||||||
|
@JsonProperty("data") val data: JikanData? = null,
|
||||||
|
)
|
||||||
|
|
||||||
|
data class IdMal(
|
||||||
|
@JsonProperty("idMal") val idMal: String? = null,
|
||||||
|
)
|
||||||
|
|
||||||
|
data class MediaAni(
|
||||||
|
@JsonProperty("Media") val media: IdMal? = null,
|
||||||
|
)
|
||||||
|
|
||||||
|
data class DataAni(
|
||||||
|
@JsonProperty("data") val data: MediaAni? = null,
|
||||||
|
)
|
||||||
|
|
||||||
data class CoverImage(
|
data class CoverImage(
|
||||||
@JsonProperty("extraLarge") var extraLarge: String? = null,
|
@JsonProperty("extraLarge") var extraLarge: String? = null,
|
||||||
@JsonProperty("large") var large: String? = null,
|
@JsonProperty("large") var large: String? = null,
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package com.hexated
|
package com.hexated
|
||||||
|
|
||||||
|
import com.hexated.Anichi.Companion.anilistApi
|
||||||
import com.hexated.Anichi.Companion.apiEndPoint
|
import com.hexated.Anichi.Companion.apiEndPoint
|
||||||
import com.lagradost.cloudstream3.Episode
|
import com.lagradost.cloudstream3.Episode
|
||||||
import com.lagradost.cloudstream3.app
|
import com.lagradost.cloudstream3.app
|
||||||
|
@ -69,7 +70,7 @@ suspend fun fetchId(title: String?, year: Int?, season: String?, type: String?):
|
||||||
).toJson().toRequestBody(RequestBodyTypes.JSON.toMediaTypeOrNull())
|
).toJson().toRequestBody(RequestBodyTypes.JSON.toMediaTypeOrNull())
|
||||||
|
|
||||||
return try {
|
return try {
|
||||||
app.post("https://graphql.anilist.co", requestBody = data)
|
app.post(anilistApi, requestBody = data)
|
||||||
.parsedSafe<AniSearch>()?.data?.Page?.media?.firstOrNull()
|
.parsedSafe<AniSearch>()?.data?.Page?.media?.firstOrNull()
|
||||||
} catch (t: Throwable) {
|
} catch (t: Throwable) {
|
||||||
logError(t)
|
logError(t)
|
||||||
|
@ -78,6 +79,14 @@ suspend fun fetchId(title: String?, year: Int?, season: String?, type: String?):
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
suspend fun aniToMal(id: String): String? {
|
||||||
|
return app.post(
|
||||||
|
anilistApi, data = mapOf(
|
||||||
|
"query" to "{Media(id:$id,type:ANIME){idMal}}",
|
||||||
|
)
|
||||||
|
).parsedSafe<DataAni>()?.data?.media?.idMal
|
||||||
|
}
|
||||||
|
|
||||||
fun decode(input: String): String = URLDecoder.decode(input, "utf-8")
|
fun decode(input: String): String = URLDecoder.decode(input, "utf-8")
|
||||||
|
|
||||||
private val embedBlackList = listOf(
|
private val embedBlackList = listOf(
|
||||||
|
|
Loading…
Reference in a new issue