From f8883e3692510c47232b937d93c65815aec7a6be Mon Sep 17 00:00:00 2001 From: Jace <54625750+Jacekun@users.noreply.github.com> Date: Wed, 22 Dec 2021 07:11:13 +0800 Subject: [PATCH] add pinoy-hd.xyz provider (#338) * Add pinoy-hd.xyz to movie providers. * Add pinoymovies.es site * Add download option for pinoymoviepedia, and various cleanups. --- .../com/lagradost/cloudstream3/MainAPI.kt | 4 +- .../extractors/UpstreamExtractor.kt | 59 ++++ .../cloudstream3/extractors/VoeExtractor.kt | 52 +++ .../movieproviders/PinoyHDXyzProvider.kt | 224 ++++++++++++ .../movieproviders/PinoyMoviePedia.kt | 328 ------------------ .../movieproviders/PinoyMoviePediaProvider.kt | 225 ++++++++++++ .../movieproviders/PinoyMoviesEsProvider.kt | 233 +++++++++++++ .../cloudstream3/utils/ExtractorApi.kt | 2 + 8 files changed, 798 insertions(+), 329 deletions(-) create mode 100644 app/src/main/java/com/lagradost/cloudstream3/extractors/UpstreamExtractor.kt create mode 100644 app/src/main/java/com/lagradost/cloudstream3/extractors/VoeExtractor.kt create mode 100644 app/src/main/java/com/lagradost/cloudstream3/movieproviders/PinoyHDXyzProvider.kt delete mode 100644 app/src/main/java/com/lagradost/cloudstream3/movieproviders/PinoyMoviePedia.kt create mode 100644 app/src/main/java/com/lagradost/cloudstream3/movieproviders/PinoyMoviePediaProvider.kt create mode 100644 app/src/main/java/com/lagradost/cloudstream3/movieproviders/PinoyMoviesEsProvider.kt diff --git a/app/src/main/java/com/lagradost/cloudstream3/MainAPI.kt b/app/src/main/java/com/lagradost/cloudstream3/MainAPI.kt index 7965ad4b..7e1df122 100644 --- a/app/src/main/java/com/lagradost/cloudstream3/MainAPI.kt +++ b/app/src/main/java/com/lagradost/cloudstream3/MainAPI.kt @@ -59,7 +59,9 @@ object APIHolder { FilmanProvider(), ZoroProvider(), - PinoyMoviePedia() + PinoyMoviePediaProvider(), + PinoyHDXyzProvider(), + PinoyMoviesEsProvider() ) val restrictedApis = arrayListOf( diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/UpstreamExtractor.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/UpstreamExtractor.kt new file mode 100644 index 00000000..cc580f33 --- /dev/null +++ b/app/src/main/java/com/lagradost/cloudstream3/extractors/UpstreamExtractor.kt @@ -0,0 +1,59 @@ +package com.lagradost.cloudstream3.extractors + +import com.lagradost.cloudstream3.app +import com.lagradost.cloudstream3.utils.ExtractorApi +import com.lagradost.cloudstream3.utils.ExtractorLink +import com.lagradost.cloudstream3.utils.Qualities + +class UpstreamExtractor: ExtractorApi() { + override val name: String = "Upstream.to" + override val mainUrl: String = "https://upstream.to" + override val requiresReferer = true + + override fun getUrl(url: String, referer: String?): List { + // WIP: m3u8 link fetched but sometimes not playing + //Log.i(this.name, "Result => (no extractor) ${url}") + val sources: MutableList = mutableListOf() + val doc = app.get(url, referer = referer).text + if (doc.isNotEmpty()) { + var reg = Regex("(?<=master)(.*)(?=hls)") + val result = reg.find(doc)?.groupValues?.map { + it.trim('|') + }?.toList() + reg = Regex("(?<=\\|file\\|)(.*)(?=\\|remove\\|)") + val domainList = reg.find(doc)?.groupValues?.get(1)?.split("|") + var domain = when (!domainList.isNullOrEmpty()) { + true -> { + if (domainList.isNotEmpty()) { + var domName = "" + for (part in domainList) { + domName = "${part}.${domName}" + } + domName.trimEnd('.') + } else { "" } + } + false -> "" + } + //Log.i(this.name, "Result => (domain) ${domain}") + if (domain.isEmpty()) { + domain = "s96.upstreamcdn.co" + //Log.i(this.name, "Result => (default domain) ${domain}") + } + + result?.forEach { + val linkUrl = "https://${domain}/hls/${it}/master.m3u8" + sources.add( + ExtractorLink( + name = "Upstream m3u8", + source = this.name, + url = linkUrl, + quality = Qualities.Unknown.value, + referer = referer!!, + isM3u8 = true + ) + ) + } + } + return sources + } +} \ No newline at end of file diff --git a/app/src/main/java/com/lagradost/cloudstream3/extractors/VoeExtractor.kt b/app/src/main/java/com/lagradost/cloudstream3/extractors/VoeExtractor.kt new file mode 100644 index 00000000..77e81326 --- /dev/null +++ b/app/src/main/java/com/lagradost/cloudstream3/extractors/VoeExtractor.kt @@ -0,0 +1,52 @@ +package com.lagradost.cloudstream3.extractors + +import com.fasterxml.jackson.annotation.JsonProperty +import com.fasterxml.jackson.module.kotlin.readValue +import com.lagradost.cloudstream3.app +import com.lagradost.cloudstream3.mapper +import com.lagradost.cloudstream3.utils.ExtractorApi +import com.lagradost.cloudstream3.utils.ExtractorLink +import com.lagradost.cloudstream3.utils.getQualityFromName + +open class VoeExtractor : ExtractorApi() { + override val name: String = "Voe" + override val mainUrl: String = "https://voe.sx" + override val requiresReferer = false + + private data class ResponseLinks( + @JsonProperty("hls") val url: String?, + @JsonProperty("video_height") val label: Int? + //val type: String // Mp4 + ) + + override fun getUrl(url: String, referer: String?): List { + val extractedLinksList: MutableList = mutableListOf() + val doc = app.get(url).text + if (doc.isNotEmpty()) { + val start = "const sources =" + var src = doc.substring(doc.indexOf(start)) + src = src.substring(start.length, src.indexOf(";")) + .replace("0,", "0") + .trim() + //Log.i(this.name, "Result => (src) ${src}") + mapper.readValue(src)?.let { voelink -> + //Log.i(this.name, "Result => (voelink) ${voelink}") + val linkUrl = voelink.url + val linkLabel = voelink.label?.toString() ?: "" + if (!linkUrl.isNullOrEmpty()) { + extractedLinksList.add( + ExtractorLink( + name = "Voe ${linkLabel}", + source = this.name, + url = linkUrl, + quality = getQualityFromName(linkLabel), + referer = url, + isM3u8 = true + ) + ) + } + } + } + return extractedLinksList + } +} \ No newline at end of file diff --git a/app/src/main/java/com/lagradost/cloudstream3/movieproviders/PinoyHDXyzProvider.kt b/app/src/main/java/com/lagradost/cloudstream3/movieproviders/PinoyHDXyzProvider.kt new file mode 100644 index 00000000..e5ee744c --- /dev/null +++ b/app/src/main/java/com/lagradost/cloudstream3/movieproviders/PinoyHDXyzProvider.kt @@ -0,0 +1,224 @@ +package com.lagradost.cloudstream3.movieproviders + +import android.util.Log +import com.lagradost.cloudstream3.* +import com.lagradost.cloudstream3.utils.ExtractorLink +import com.lagradost.cloudstream3.utils.loadExtractor +import org.jsoup.Jsoup + +class PinoyHDXyzProvider : MainAPI() { + override val name = "Pinoy-HD" + override val mainUrl = "https://www.pinoy-hd.xyz" + override val lang = "tl" + override val supportedTypes = setOf(TvType.Movie, TvType.TvSeries) + override val hasDownloadSupport = false + override val hasMainPage = true + override val hasQuickSearch = false + + + override fun getMainPage(): HomePageResponse { + val all = ArrayList() + val html = app.get(mainUrl, referer = mainUrl).text + val document = Jsoup.parse(html) + val mainbody = document.getElementsByTag("body") + + mainbody?.select("div.section-cotent.col-md-12.bordert")?.forEach { row -> + val title = row?.select("div.title-section.tt")?.text() ?: "" + val inner = row?.select("li.img_frame.preview-tumb7") + if (inner != null) { + val elements: List = inner.map { + // Get inner div from article + val innerBody = it?.select("a")?.firstOrNull() + // Fetch details + val name = it?.text() ?: "" + val link = innerBody?.attr("href") ?: "" + val imgsrc = innerBody?.select("img")?.attr("src") + val image = when (!imgsrc.isNullOrEmpty()) { + true -> "${mainUrl}${imgsrc}" + false -> null + } + //Log.i(this.name, "Result => (innerBody, image) ${innerBody} / ${image}") + // Get Year from Link + val rex = Regex("_(\\d+)_") + val yearRes = rex.find(link)?.value ?: "" + val year = yearRes.replace("_", "").toIntOrNull() + //Log.i(this.name, "Result => (yearRes, year) ${yearRes} / ${year}") + MovieSearchResponse( + name, + link, + this.name, + TvType.Movie, + image, + year, + null, + ) + }.filter { a -> a.url.isNotEmpty() } + .filter { b -> b.name.isNotEmpty() } + .distinctBy { c -> c.url } + // Add + all.add( + HomePageList( + title, elements + ) + ) + } + } + return HomePageResponse(all) + } + + override fun search(query: String): List { + val url = "$mainUrl/search/?q=${query.replace(" ", "+")}" + val html = app.get(url).text + val document = Jsoup.parse(html).select("div.portfolio-thumb") + if (document != null) { + return document.map { + + val link = it?.select("a")?.firstOrNull()?.attr("href") ?: "" + val title = it?.text() ?: "" + val year = null + val image = null // site provides no image on search page + + MovieSearchResponse( + title, + link, + this.name, + TvType.Movie, + image, + year + ) + }.filter { a -> a.url.isNotEmpty() } + .filter { b -> b.name.isNotEmpty() } + .distinctBy { c -> c.url } + } + return listOf() + } + + override fun load(url: String): LoadResponse { + val response = app.get(url).text + val doc = Jsoup.parse(response) + val body = doc.getElementsByTag("body") + val inner = body?.select("div.info") + + // Video details + val tvtype = when (url.contains("/pinoy_tv_series/", ignoreCase = true)) { + true -> TvType.TvSeries + false -> TvType.Movie + } + val imgLinkCode = inner?.select("div.portfolio-tumb.ph-link > img")?.attr("src") + val poster = if (!imgLinkCode.isNullOrEmpty()) { "${mainUrl}${imgLinkCode}" } else { null } + //Log.i(this.name, "Result => (imgLinkCode) ${imgLinkCode}") + val title = inner?.select("td.trFon2.entt")?.firstOrNull()?.text() ?: "" + var yearRes = inner?.select("td.trFon2")?.toString() + if (!yearRes.isNullOrEmpty()) { + if (yearRes.contains("var year =")) { + yearRes = yearRes.substring(yearRes.indexOf("var year =")) + yearRes = yearRes.substring(0, yearRes.indexOf(';')).replace("var year =", "") + .trim().trim('\'') + } + } + //Log.i(this.name, "Result => (yearRes) ${yearRes}") + val year = yearRes?.toIntOrNull() + + var descript = body?.select("div.eText")?.text() + if (!descript.isNullOrEmpty()) { + descript = descript.substring(0, descript.indexOf("_x_Polus1")) + .replace("_x_Polus1", "") + } + + // Video links + val listOfLinks: MutableList = mutableListOf() + val linkMain = body?.select("div.tabcontent > iframe")?.attr("src") + if (!linkMain.isNullOrEmpty()) { + listOfLinks.add(linkMain) + } + var extraLinks = body?.select("div.tabcontent.hide")?.text() + if (!extraLinks.isNullOrEmpty()) { + extraLinks = extraLinks.substring(extraLinks.indexOf("_x_Polus1")) + extraLinks = extraLinks.trim().substring("_x_Polus1".length) + extraLinks = extraLinks.substring(0, extraLinks.indexOf("