package com.hexated import com.fasterxml.jackson.annotation.JsonProperty import com.lagradost.cloudstream3.* import com.lagradost.cloudstream3.LoadResponse.Companion.addTrailer import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.Qualities import org.jsoup.nodes.Element import java.util.* class TocanimeProvider : MainAPI() { override var mainUrl = "https://tocanime.co" override var name = "Tocanime" override val hasMainPage = true override var lang = "vi" override val hasDownloadSupport = true override val supportedTypes = setOf( TvType.Anime, TvType.AnimeMovie, TvType.OVA ) companion object { fun getType(t: String): TvType { return when { t.contains("OVA") || t.contains("Special") -> TvType.OVA t.contains("Movie") -> TvType.AnimeMovie else -> TvType.Anime } } fun getStatus(t: String): ShowStatus { return when (t) { "Đã hoàn thành" -> ShowStatus.Completed "Chưa hoàn thành" -> ShowStatus.Ongoing else -> ShowStatus.Completed } } } override suspend fun getMainPage(page: Int, request : MainPageRequest): HomePageResponse { val document = app.get(mainUrl).document val homePageList = ArrayList() document.select("div#playlists > div").forEach { block -> val header = block.selectFirst("h2")?.text()?.trim() ?: "" val items = block.select("div.col-lg-3.col-md-4.col-6").map { it.toSearchResult() } if (items.isNotEmpty()) homePageList.add(HomePageList(header, items)) } return HomePageResponse(homePageList) } private fun Element.toSearchResult(): AnimeSearchResponse { val title = this.selectFirst("h3 a")?.text()?.trim() ?: "" val href = fixUrl(this.selectFirst("h3 a")!!.attr("href")) val posterUrl = fixUrlNull(this.selectFirst("div.card-item-img")?.attr("data-original")) val epNum = this.selectFirst("div.card-item-badget.rtl")?.text()?.let { eps -> val num = eps.filter { it.isDigit() }.toIntOrNull() if(eps.contains("Preview")) { num?.minus(1) } else { num } } return newAnimeSearchResponse(title, href, TvType.Anime) { this.posterUrl = posterUrl addSub(epNum) } } override suspend fun search(query: String): List { val document = app.get("$mainUrl/content/search?t=kw&q=$query").document return document.select("div.col-lg-3.col-md-4.col-6").map { it.toSearchResult() } } override suspend fun load(url: String): LoadResponse? { val document = app.get(url).document val title = document.selectFirst("h1.title")?.text() ?: return null val type = if (document.select("div.me-list.scroller a").size == 1) TvType.AnimeMovie else TvType.Anime val episodes = document.select("div.me-list.scroller a").mapNotNull { Episode(fixUrl(it.attr("href")), it.text()) }.reversed() val trailer = document.selectFirst("div#trailer script")?.data()?.substringAfter("