mirror of
				https://github.com/recloudstream/cloudstream.git
				synced 2024-08-15 01:53:11 +00:00 
			
		
		
		
	[Feature] Add quality and year to various providers. (#887)
* add more quality to SearchQuality enum. Add quality to Pinoymovieses provider. * add quality and year to sflix.
This commit is contained in:
		
							parent
							
								
									c11a96a3e1
								
							
						
					
					
						commit
						a84468d726
					
				
					 5 changed files with 71 additions and 24 deletions
				
			
		| 
						 | 
				
			
			@ -554,11 +554,14 @@ enum class SearchQuality {
 | 
			
		|||
    Telecine, // TC
 | 
			
		||||
    HQ,
 | 
			
		||||
    HD,
 | 
			
		||||
    HDR, // high dynamic range
 | 
			
		||||
    BlueRay,
 | 
			
		||||
    DVD,
 | 
			
		||||
    SD,
 | 
			
		||||
    FourK,
 | 
			
		||||
    UHD,
 | 
			
		||||
    SDR, // standard dynamic range
 | 
			
		||||
    WebRip
 | 
			
		||||
}
 | 
			
		||||
 | 
			
		||||
/**Add anything to here if you find a site that uses some specific naming convention*/
 | 
			
		||||
| 
						 | 
				
			
			@ -567,22 +570,33 @@ fun getQualityFromString(string: String?) : SearchQuality? {
 | 
			
		|||
 | 
			
		||||
    return when(check) {
 | 
			
		||||
        "cam" -> SearchQuality.Cam
 | 
			
		||||
        "camrip" -> SearchQuality.CamRip
 | 
			
		||||
        "hdcam" -> SearchQuality.HdCam
 | 
			
		||||
        "highquality" -> SearchQuality.HQ
 | 
			
		||||
        "hq" -> SearchQuality.HQ
 | 
			
		||||
        "highdefinition" -> SearchQuality.HD
 | 
			
		||||
        "hdrip" -> SearchQuality.HD
 | 
			
		||||
        "hd" -> SearchQuality.HD
 | 
			
		||||
        "camrip" -> SearchQuality.CamRip
 | 
			
		||||
        "rip" -> SearchQuality.CamRip
 | 
			
		||||
        "telecine" -> SearchQuality.Telecine
 | 
			
		||||
        "tc" -> SearchQuality.Telecine
 | 
			
		||||
        "telesync" -> SearchQuality.Telesync
 | 
			
		||||
        "ts" -> SearchQuality.Telesync
 | 
			
		||||
        "dvd" -> SearchQuality.DVD
 | 
			
		||||
        "blueray" ->  SearchQuality.BlueRay
 | 
			
		||||
        "bluray" -> SearchQuality.BlueRay
 | 
			
		||||
        "br" -> SearchQuality.BlueRay
 | 
			
		||||
        "standard" -> SearchQuality.SD
 | 
			
		||||
        "sd" -> SearchQuality.SD
 | 
			
		||||
        "4k" -> SearchQuality.FourK
 | 
			
		||||
        "uhd" -> SearchQuality.UHD // may also be 4k or 8k
 | 
			
		||||
        "blue" -> SearchQuality.BlueRay
 | 
			
		||||
        "wp" -> SearchQuality.WorkPrint
 | 
			
		||||
        "workprint" -> SearchQuality.WorkPrint
 | 
			
		||||
        "webrip" -> SearchQuality.WebRip
 | 
			
		||||
        "web" -> SearchQuality.WebRip
 | 
			
		||||
        "hdr" -> SearchQuality.HDR
 | 
			
		||||
        "sdr" -> SearchQuality.SDR
 | 
			
		||||
        else -> null
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -1,12 +1,13 @@
 | 
			
		|||
package com.lagradost.cloudstream3.movieproviders
 | 
			
		||||
 | 
			
		||||
import android.util.Log
 | 
			
		||||
import com.fasterxml.jackson.annotation.JsonProperty
 | 
			
		||||
import com.fasterxml.jackson.module.kotlin.readValue
 | 
			
		||||
import com.lagradost.cloudstream3.*
 | 
			
		||||
import com.lagradost.cloudstream3.extractors.FEmbed
 | 
			
		||||
import com.lagradost.cloudstream3.extractors.helper.VstreamhubHelper
 | 
			
		||||
import com.lagradost.cloudstream3.network.DdosGuardKiller
 | 
			
		||||
import com.lagradost.cloudstream3.utils.AppUtils.toJson
 | 
			
		||||
import com.lagradost.cloudstream3.utils.AppUtils.tryParseJson
 | 
			
		||||
import com.lagradost.cloudstream3.utils.ExtractorLink
 | 
			
		||||
import com.lagradost.cloudstream3.utils.loadExtractor
 | 
			
		||||
import org.jsoup.select.Elements
 | 
			
		||||
| 
						 | 
				
			
			@ -55,6 +56,8 @@ class PinoyMoviesEsProvider : MainAPI() {
 | 
			
		|||
                    val rex = Regex("\\((\\d+)")
 | 
			
		||||
                    year = rex.find(name)?.value?.replace("(", "")?.toIntOrNull()
 | 
			
		||||
                }
 | 
			
		||||
                //Log.i(this.name, "ApiError -> ${it.selectFirst("span.quality")?.text()}")
 | 
			
		||||
                val searchQual = getQualityFromString(it.selectFirst("span.quality")?.text())
 | 
			
		||||
 | 
			
		||||
                MovieSearchResponse(
 | 
			
		||||
                    name = name,
 | 
			
		||||
| 
						 | 
				
			
			@ -62,7 +65,8 @@ class PinoyMoviesEsProvider : MainAPI() {
 | 
			
		|||
                    apiName = this.name,
 | 
			
		||||
                    type = TvType.Movie,
 | 
			
		||||
                    posterUrl = image,
 | 
			
		||||
                    year = year
 | 
			
		||||
                    year = year,
 | 
			
		||||
                    quality = searchQual
 | 
			
		||||
                )
 | 
			
		||||
            }?.distinctBy { c -> c.url } ?: listOf()
 | 
			
		||||
            //Add to list of homepages
 | 
			
		||||
| 
						 | 
				
			
			@ -116,14 +120,16 @@ class PinoyMoviesEsProvider : MainAPI() {
 | 
			
		|||
            val title = urlTitle.text()?.trim() ?: "<No Title>"
 | 
			
		||||
            val year = urlTitle.select("span.year")?.text()?.toIntOrNull()
 | 
			
		||||
            val image = it.select("div.poster > img")?.attr("src")
 | 
			
		||||
            val searchQual = getQualityFromString(it.selectFirst("span.quality")?.text())
 | 
			
		||||
 | 
			
		||||
            MovieSearchResponse(
 | 
			
		||||
                title,
 | 
			
		||||
                link,
 | 
			
		||||
                this.name,
 | 
			
		||||
                TvType.Movie,
 | 
			
		||||
                image,
 | 
			
		||||
                year
 | 
			
		||||
                name = title,
 | 
			
		||||
                url = link,
 | 
			
		||||
                apiName = this.name,
 | 
			
		||||
                type = TvType.Movie,
 | 
			
		||||
                posterUrl = image,
 | 
			
		||||
                year = year,
 | 
			
		||||
                quality = searchQual
 | 
			
		||||
            )
 | 
			
		||||
        }?.distinctBy { it.url } ?: listOf()
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			@ -177,10 +183,10 @@ class PinoyMoviesEsProvider : MainAPI() {
 | 
			
		|||
            )
 | 
			
		||||
            val innerPage = app.post("https://pinoymovies.es/wp-admin/admin-ajax.php ",
 | 
			
		||||
                referer = url, data = content).document.select("body")?.text()?.trim()
 | 
			
		||||
            if (!innerPage.isNullOrEmpty()) {
 | 
			
		||||
                val embedData = mapper.readValue<EmbedUrl>(innerPage)
 | 
			
		||||
                //Log.i(this.name, "Result => (embed_url) ${embedData.embed_url}")
 | 
			
		||||
                listOfLinks.add(embedData.embed_url)
 | 
			
		||||
            if (!innerPage.isNullOrBlank()) {
 | 
			
		||||
                tryParseJson<EmbedUrl>(innerPage)?.let {
 | 
			
		||||
                    listOfLinks.add(it.embed_url)
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return MovieLoadResponse(
 | 
			
		||||
| 
						 | 
				
			
			@ -205,7 +211,7 @@ class PinoyMoviesEsProvider : MainAPI() {
 | 
			
		|||
    ): Boolean {
 | 
			
		||||
        // parse movie servers
 | 
			
		||||
        var count = 0
 | 
			
		||||
        mapper.readValue<List<String>>(data).forEach { link ->
 | 
			
		||||
        tryParseJson<List<String>>(data)?.forEach { link ->
 | 
			
		||||
            //Log.i(this.name, "Result => (link) $link")
 | 
			
		||||
            if (link.startsWith("https://vstreamhub.com")) {
 | 
			
		||||
                VstreamhubHelper.getUrls(link, callback)
 | 
			
		||||
| 
						 | 
				
			
			@ -225,4 +231,4 @@ class PinoyMoviesEsProvider : MainAPI() {
 | 
			
		|||
        }
 | 
			
		||||
        return count > 0
 | 
			
		||||
    }
 | 
			
		||||
}
 | 
			
		||||
}
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -59,7 +59,7 @@ open class SflixProvider : MainAPI() {
 | 
			
		|||
        map.forEach {
 | 
			
		||||
            all.add(HomePageList(
 | 
			
		||||
                it.key,
 | 
			
		||||
                document.select(it.value).select("div.film-poster").map { element ->
 | 
			
		||||
                document.select(it.value).select("div.flw-item").map { element ->
 | 
			
		||||
                    element.toSearchResult()
 | 
			
		||||
                }
 | 
			
		||||
            ))
 | 
			
		||||
| 
						 | 
				
			
			@ -67,7 +67,7 @@ open class SflixProvider : MainAPI() {
 | 
			
		|||
 | 
			
		||||
        document.select("section.block_area.block_area_home.section-id-02").forEach {
 | 
			
		||||
            val title = it.select("h2.cat-heading").text().trim()
 | 
			
		||||
            val elements = it.select("div.film-poster").map { element ->
 | 
			
		||||
            val elements = it.select("div.flw-item").map { element ->
 | 
			
		||||
                element.toSearchResult()
 | 
			
		||||
            }
 | 
			
		||||
            all.add(HomePageList(title, elements))
 | 
			
		||||
| 
						 | 
				
			
			@ -500,19 +500,39 @@ open class SflixProvider : MainAPI() {
 | 
			
		|||
    }
 | 
			
		||||
 | 
			
		||||
    private fun Element.toSearchResult(): SearchResponse {
 | 
			
		||||
        val img = this.select("img")
 | 
			
		||||
        val inner = this.selectFirst("div.film-poster")
 | 
			
		||||
        val img = inner.select("img")
 | 
			
		||||
        val title = img.attr("title")
 | 
			
		||||
        val posterUrl = img.attr("data-src")
 | 
			
		||||
        val href = fixUrl(this.select("a").attr("href"))
 | 
			
		||||
        val posterUrl = img.attr("data-src") ?: img.attr("src")
 | 
			
		||||
        val href = fixUrl(inner.select("a").attr("href"))
 | 
			
		||||
        val isMovie = href.contains("/movie/")
 | 
			
		||||
        val otherInfo = this.selectFirst("div.film-detail > div.fd-infor")?.select("span")?.toList() ?: listOf()
 | 
			
		||||
        var rating: Int? = null
 | 
			
		||||
        var year: Int? = null
 | 
			
		||||
        var quality: SearchQuality? = null
 | 
			
		||||
        when (otherInfo.size) {
 | 
			
		||||
            1 -> {
 | 
			
		||||
                year = otherInfo[0]?.text()?.trim()?.toIntOrNull()
 | 
			
		||||
            }
 | 
			
		||||
            2 -> {
 | 
			
		||||
                year = otherInfo[0]?.text()?.trim()?.toIntOrNull()
 | 
			
		||||
            }
 | 
			
		||||
            3 -> {
 | 
			
		||||
                rating = otherInfo[0]?.text()?.toRatingInt()
 | 
			
		||||
                quality = getQualityFromString(otherInfo[1]?.text())
 | 
			
		||||
                year = otherInfo[2]?.text()?.trim()?.toIntOrNull()
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
 | 
			
		||||
        return if (isMovie) {
 | 
			
		||||
            MovieSearchResponse(
 | 
			
		||||
                title,
 | 
			
		||||
                href,
 | 
			
		||||
                this@SflixProvider.name,
 | 
			
		||||
                TvType.Movie,
 | 
			
		||||
                posterUrl,
 | 
			
		||||
                null
 | 
			
		||||
                posterUrl = posterUrl,
 | 
			
		||||
                year = year,
 | 
			
		||||
                quality = quality
 | 
			
		||||
            )
 | 
			
		||||
        } else {
 | 
			
		||||
            TvSeriesSearchResponse(
 | 
			
		||||
| 
						 | 
				
			
			@ -521,8 +541,9 @@ open class SflixProvider : MainAPI() {
 | 
			
		|||
                this@SflixProvider.name,
 | 
			
		||||
                TvType.Movie,
 | 
			
		||||
                posterUrl,
 | 
			
		||||
                null,
 | 
			
		||||
                null
 | 
			
		||||
                year = null,
 | 
			
		||||
                episodes = year,
 | 
			
		||||
                quality = quality
 | 
			
		||||
            )
 | 
			
		||||
        }
 | 
			
		||||
    }
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -61,6 +61,9 @@ object SearchResultBuilder {
 | 
			
		|||
            SearchQuality.SD -> R.string.quality_sd
 | 
			
		||||
            SearchQuality.FourK -> R.string.quality_4k
 | 
			
		||||
            SearchQuality.UHD -> R.string.quality_uhd
 | 
			
		||||
            SearchQuality.SDR -> R.string.quality_sdr
 | 
			
		||||
            SearchQuality.HDR -> R.string.quality_hdr
 | 
			
		||||
            SearchQuality.WebRip -> R.string.quality_webrip
 | 
			
		||||
            else -> null
 | 
			
		||||
        }?.let { textRes ->
 | 
			
		||||
            textQuality?.setText(textRes)
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
| 
						 | 
				
			
			@ -447,6 +447,9 @@
 | 
			
		|||
    <string name="quality_4k">4K</string>
 | 
			
		||||
    <string name="quality_sd">SD</string>
 | 
			
		||||
    <string name="quality_uhd">UHD</string>
 | 
			
		||||
    <string name="quality_hdr">HDR</string>
 | 
			
		||||
    <string name="quality_sdr">SDR</string>
 | 
			
		||||
    <string name="quality_webrip">Web</string>
 | 
			
		||||
 | 
			
		||||
    <string name="poster_image">Poster Image</string>
 | 
			
		||||
</resources>
 | 
			
		||||
| 
						 | 
				
			
			
 | 
			
		|||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue