phisher98 / CXXX

CXXX
GNU General Public License v3.0
8 stars 1 forks source link

new provider with code #23

Closed ghost closed 3 weeks ago

ghost commented 3 weeks ago

package com.hexated

import com.lagradost.cloudstream3. import com.lagradost.cloudstream3.LoadResponse.Companion.addActors import com.lagradost.cloudstream3.network.CloudflareKiller import com.lagradost.cloudstream3.extractors.StreamTape import com.lagradost.cloudstream3.mvvm.safeApiCall import com.lagradost.cloudstream3.utils.ExtractorLink import com.lagradost.cloudstream3.utils.AppUtils.parseJson import com.lagradost.cloudstream3.utils.AppUtils.toJson import com.lagradost.cloudstream3.utils.loadExtractor import com.lagradost.cloudstream3.utils. import org.jsoup.Jsoup import org.jsoup.nodes.Element import java.util.*

class Fxprnhd : MainAPI() { override var mainUrl = "https://fxpornhd.com" override var name = "Fxprnhd" override val hasMainPage = true override val hasDownloadSupport = true override val vpnStatus = VPNStatus.MightBeNeeded override val supportedTypes = setOf(TvType.NSFW)

override val mainPage = mainPageOf(
    "$mainUrl/c/bangbros/page/" to "Bang Bros",
    "$mainUrl/c/brazzers/page/" to "Brazzers",
    "$mainUrl/c/realitykings/page/" to "Reality Kings",
    "$mainUrl/c/blacked/page/" to "Blacked",
    "$mainUrl/c/pervmom/page/" to "Pervmom",

)

override suspend fun getMainPage(
    page: Int,
    request: MainPageRequest
): HomePageResponse {
    val document = app.get(request.data + page).document
    val home =
        document.select("div.videos-list > article")
            .mapNotNull {
                it.toSearchResult()
            }
    return newHomePageResponse(
        list = HomePageList(
            name = request.name,
            list = home,
            isHorizontalImages = true
        ),
        hasNext = true
    )
}

private fun Element.toSearchResult(): SearchResponse? {
    val title = this.selectFirst("span.title")?.text() ?: return null
    val href = fixUrl(this.selectFirst("a")!!.attr("href"))
    val posterUrl = fixUrlNull(this.select("img").attr("src"))
    return newMovieSearchResponse(title, href, TvType.Movie) {
        this.posterUrl = posterUrl
    }

}

override suspend fun search(query: String): List<SearchResponse> {
    val searchResponse = mutableListOf<SearchResponse>()
    for (i in 1..15) {
        val document =
            app.get(
                "$mainUrl/search/?s=query&page=$i",
                headers = mapOf("X-Requested-With" to "XMLHttpRequest")
            ).document
        val results =
            document.select("div.videos-list > article")
                .mapNotNull {
                    it.toSearchResult()
                }
        searchResponse.addAll(results)
        if (results.isEmpty()) break
    }
    return searchResponse
}

override suspend fun load(url: String): LoadResponse {
    val document = app.get(url).document

    val title = document.selectFirst("div.title-views > h1")?.text()?.trim().toString()
    val poster =
        fixUrlNull(document.selectFirst("meta[property=og:image]")?.attr("content").toString())
    val tags = document.select("div.tags-list > i").map { it.text() }
    val description = document.select("div#rmjs-1 p:nth-child(1) > br").text().trim()
    val actors = document.select("div#rmjs-1 p:nth-child(1) a:nth-child(2) > strong").map { it.text() }

    val recommendations =
        document.select("div.videos-list > article").mapNotNull {
            it.toSearchResult()
        }

    return newMovieLoadResponse(title, url, TvType.NSFW, url) {
        this.posterUrl = poster
        this.plot = description
        this.tags = tags
        addActors(actors)
        this.recommendations = recommendations
    }
}

override suspend fun loadLinks(
    data: String,
    isCasting: Boolean,
    subtitleCallback: (SubtitleFile) -> Unit,
    callback: (ExtractorLink) -> Unit
): Boolean {

    val iframe = app.get(data).document.select("div.responsive-player iframe").attr("src")

    if (iframe.startsWith(mainUrl)) {
        val video = app.get(iframe, referer = data).document.select("video source").attr("src")
        callback.invoke(
            ExtractorLink(
                this.name,
                this.name,
                video,
                "$mainUrl/",
                Qualities.Unknown.value,
                INFER_TYPE,
                headers = mapOf(
                    "Range" to "bytes=0-",
                ),
            )
        )
    } else {
        loadExtractor(iframe, "$mainUrl/", subtitleCallback, callback)
    }

    return true
}

}

ghost commented 3 weeks ago

package com.hexated

import com.lagradost.cloudstream3.extractors.StreamTape

class StreamTapeTo : StreamTape() { override var mainUrl = "https://streamtape.com" }

SaurabhKaperwan commented 3 weeks ago

Bro make pr

ghost commented 3 weeks ago

repo is unavailable now to make pr

phisher98 commented 3 weeks ago

Create a Fork and then do a PR after adding it

ghost commented 3 weeks ago

i am on phone and can't do pr 😓

phisher98 commented 3 weeks ago

Okay I will try

phisher98 commented 3 weeks ago

Added 3d469f0