diff --git a/Loklok/build.gradle.kts b/Loklok/build.gradle.kts index 65a46a3d..22a91aa0 100644 --- a/Loklok/build.gradle.kts +++ b/Loklok/build.gradle.kts @@ -1,5 +1,5 @@ // use an integer for version numbers -version = 10 +version = 11 cloudstream { diff --git a/Loklok/src/main/kotlin/com/hexated/Loklok.kt b/Loklok/src/main/kotlin/com/hexated/Loklok.kt index 171e3c74..3f90fc64 100644 --- a/Loklok/src/main/kotlin/com/hexated/Loklok.kt +++ b/Loklok/src/main/kotlin/com/hexated/Loklok.kt @@ -17,6 +17,7 @@ class Loklok : MainAPI() { override val hasMainPage = true override val hasChromecastSupport = true override val instantLinkLoading = true + override val hasQuickSearch = true override val supportedTypes = setOf( TvType.Movie, TvType.TvSeries, @@ -79,6 +80,23 @@ class Loklok : MainAPI() { } } + override suspend fun quickSearch(query: String): List? { + val body = mapOf( + "searchKeyWord" to query, + "size" to "50", + "sort" to "", + "searchType" to "", + ).toJson().toRequestBody(RequestBodyTypes.JSON.toMediaTypeOrNull()) + + return app.post( + "$apiUrl/search/v1/searchWithKeyWord", + requestBody = body, + headers = headers + ).parsedSafe()?.data?.searchResults?.mapNotNull { media -> + media.toSearchResponse() + } + } + override suspend fun search(query: String): List { val res = app.get( "$searchApi/search?keyword=$query", @@ -159,7 +177,7 @@ class Loklok : MainAPI() { val animeType = if(type == TvType.Anime && data.category == 0) "movie" else "tv" val malId = if(type == TvType.Anime) { - app.get("${jikanAPI}/anime?q=${res.name}&start_date=${res.year}&type=$animeType&limit=1") + app.get("${jikanAPI}/anime?q=${res.name}&start_date=${res.year}&type=$animeType&order_by=start_date&limit=1") .parsedSafe()?.data?.firstOrNull()?.mal_id } else { null @@ -209,26 +227,23 @@ class Loklok : MainAPI() { subtitleCallback: (SubtitleFile) -> Unit, callback: (ExtractorLink) -> Unit ): Boolean { - val res = parseJson(data) - val video = res.definitionList?.map { - MetaData(res.category, res.id, res.epId, it.code) - } ?: return false - - val json = app.post( - "$apiUrl/media/bathGetplayInfo", - requestBody = video.toJson().toRequestBody(RequestBodyTypes.JSON.toMediaTypeOrNull()), - headers = headers, - ).text - tryParseJson(json)?.data?.map { link -> + res.definitionList?.map { video -> + val body = """[{"category":${res.category},"contentId":"${res.id}","episodeId":${res.epId},"definition":"${video.code}"}]""".toRequestBody(RequestBodyTypes.JSON.toMediaTypeOrNull()) + val response = app.post( + "$apiUrl/media/bathGetplayInfo", + requestBody = body, + headers = headers, + ).text + val json = tryParseJson(response)?.data?.firstOrNull() callback.invoke( ExtractorLink( this.name, this.name, - link.mediaUrl ?: return@map null, + json?.mediaUrl ?: return@map null, "", - getQuality(link.currentDefinition ?: ""), + getQuality(json.currentDefinition ?: ""), isM3u8 = true, ) ) @@ -280,11 +295,12 @@ class Loklok : MainAPI() { val subtitlingList: List? = arrayListOf(), ) - data class MetaData( - val category: Int? = null, - val contentId: Any? = null, - val episodeId: Int? = null, - val definition: String? = null, + data class QuickSearchData( + @JsonProperty("searchResults") val searchResults: ArrayList? = arrayListOf(), + ) + + data class QuickSearchRes( + @JsonProperty("data") val data: QuickSearchData? = null, ) data class PreviewResponse(