mirror of
https://github.com/recloudstream/cloudstream.git
synced 2024-08-15 01:53:11 +00:00
Merge remote-tracking branch 'origin/master'
This commit is contained in:
commit
1a5439143c
9 changed files with 264 additions and 8 deletions
|
@ -92,6 +92,7 @@ object APIHolder {
|
|||
TantifilmProvider(),
|
||||
CineblogProvider(),
|
||||
AltadefinizioneProvider(),
|
||||
FilmpertuttiProvider(),
|
||||
HDMovie5(),
|
||||
RebahinProvider(),
|
||||
LayarKacaProvider(),
|
||||
|
|
|
@ -14,6 +14,9 @@ class DoodCxExtractor : DoodLaExtractor() {
|
|||
class DoodShExtractor : DoodLaExtractor() {
|
||||
override var mainUrl = "https://dood.sh"
|
||||
}
|
||||
class DoodWatchExtractor : DoodLaExtractor() {
|
||||
override var mainUrl = "https://dood.watch"
|
||||
}
|
||||
|
||||
class DoodPmExtractor : DoodLaExtractor() {
|
||||
override var mainUrl = "https://dood.pm"
|
||||
|
|
|
@ -10,6 +10,9 @@ class MixDropBz : MixDrop(){
|
|||
class MixDropCh : MixDrop(){
|
||||
override var mainUrl = "https://mixdrop.ch"
|
||||
}
|
||||
class MixDropTo : MixDrop(){
|
||||
override var mainUrl = "https://mixdrop.to"
|
||||
}
|
||||
|
||||
open class MixDrop : ExtractorApi() {
|
||||
override var name = "MixDrop"
|
||||
|
|
|
@ -114,7 +114,7 @@ class AltadefinizioneProvider : MainAPI() {
|
|||
|
||||
val tags: List<String> = document.select("#details > li:nth-child(1) > a").map { it.text() }
|
||||
|
||||
val trailerurl = document.selectFirst("#showtrailer > div > div > iframe")!!.attr("src")
|
||||
val trailerurl = document.selectFirst("#showtrailer > div > div > iframe")?.attr("src")
|
||||
|
||||
return newMovieLoadResponse(
|
||||
title,
|
||||
|
|
|
@ -5,6 +5,7 @@ import com.lagradost.cloudstream3.mvvm.logError
|
|||
import com.lagradost.cloudstream3.utils.ExtractorLink
|
||||
import com.lagradost.cloudstream3.utils.loadExtractor
|
||||
|
||||
|
||||
class CineblogProvider : MainAPI() {
|
||||
override var lang = "it"
|
||||
override var mainUrl = "https://cb01.rip"
|
||||
|
@ -28,6 +29,7 @@ class CineblogProvider : MainAPI() {
|
|||
val home = soup.select("article.item.movies").map {
|
||||
val title = it.selectFirst("div.data > h3 > a")!!.text().substringBefore("(")
|
||||
val link = it.selectFirst("div.poster > a")!!.attr("href")
|
||||
val quality = getQualityFromString(it.selectFirst("span.quality")?.text())
|
||||
TvSeriesSearchResponse(
|
||||
title,
|
||||
link,
|
||||
|
@ -36,6 +38,7 @@ class CineblogProvider : MainAPI() {
|
|||
it.selectFirst("img")!!.attr("src"),
|
||||
null,
|
||||
null,
|
||||
quality = quality
|
||||
)
|
||||
}
|
||||
|
||||
|
@ -82,8 +85,7 @@ class CineblogProvider : MainAPI() {
|
|||
href,
|
||||
this.name,
|
||||
TvType.Movie,
|
||||
poster,
|
||||
null
|
||||
poster
|
||||
)
|
||||
|
||||
}
|
||||
|
@ -96,7 +98,6 @@ class CineblogProvider : MainAPI() {
|
|||
val title = document.selectFirst("div.data > h1")!!.text().substringBefore("(")
|
||||
val description = document.select("#info > div.wp-content > p").html().toString()
|
||||
val rating = null
|
||||
|
||||
var year = document.selectFirst(" div.data > div.extra > span.date")!!.text().substringAfter(",")
|
||||
.filter { it.isDigit() }
|
||||
if (year.length > 4) {
|
||||
|
@ -114,8 +115,7 @@ class CineblogProvider : MainAPI() {
|
|||
href,
|
||||
this.name,
|
||||
TvType.Movie,
|
||||
posterUrl,
|
||||
null
|
||||
posterUrl
|
||||
)
|
||||
|
||||
}
|
||||
|
|
|
@ -0,0 +1,240 @@
|
|||
package com.lagradost.cloudstream3.movieproviders
|
||||
import androidx.core.text.parseAsHtml
|
||||
import com.lagradost.cloudstream3.*
|
||||
import com.lagradost.cloudstream3.mvvm.logError
|
||||
import com.lagradost.cloudstream3.app
|
||||
import com.lagradost.cloudstream3.utils.*
|
||||
import com.lagradost.cloudstream3.LoadResponse.Companion.addTrailer
|
||||
import com.lagradost.cloudstream3.LoadResponse.Companion.addRating
|
||||
import com.lagradost.cloudstream3.utils.AppUtils.toJson
|
||||
import com.lagradost.cloudstream3.utils.AppUtils.tryParseJson
|
||||
import com.lagradost.nicehttp.NiceResponse
|
||||
import org.jsoup.nodes.Element
|
||||
|
||||
|
||||
class FilmpertuttiProvider : MainAPI() {
|
||||
override var lang = "it"
|
||||
override var mainUrl = "https://www.filmpertutti.buzz"
|
||||
override var name = "Filmpertutti"
|
||||
override val hasMainPage = true
|
||||
override val hasChromecastSupport = true
|
||||
override val supportedTypes = setOf(
|
||||
TvType.Movie,
|
||||
TvType.TvSeries
|
||||
)
|
||||
|
||||
override suspend fun getMainPage(): HomePageResponse {
|
||||
val items = ArrayList<HomePageList>()
|
||||
val urls = listOf(
|
||||
Pair("$mainUrl/category/serie-tv/", "Serie Tv"),
|
||||
Pair("$mainUrl/category/film/azione/", "Azione"),
|
||||
Pair("$mainUrl/category/film/avventura/", "Avventura"),
|
||||
)
|
||||
for ((url, name) in urls) {
|
||||
try {
|
||||
val soup = app.get(url).document
|
||||
val home = soup.select("ul.posts > li").map {
|
||||
val title = it.selectFirst("div.title")!!.text().substringBeforeLast("(").substringBeforeLast("[")
|
||||
val link = it.selectFirst("a")!!.attr("href")
|
||||
val image = it.selectFirst("a")!!.attr("data-thumbnail")
|
||||
val qualitydata = it.selectFirst("div.hd")
|
||||
val quality = if (qualitydata!= null) {
|
||||
getQualityFromString(qualitydata?.text())
|
||||
}
|
||||
else {
|
||||
null
|
||||
}
|
||||
newTvSeriesSearchResponse(
|
||||
title,
|
||||
link) {
|
||||
this.posterUrl = image
|
||||
this.quality = quality
|
||||
}
|
||||
}
|
||||
|
||||
items.add(HomePageList(name, home))
|
||||
} catch (e: Exception) {
|
||||
logError(e)
|
||||
}
|
||||
}
|
||||
if (items.size <= 0) throw ErrorLoadingException()
|
||||
return HomePageResponse(items)
|
||||
}
|
||||
|
||||
override suspend fun search(query: String): List<SearchResponse> {
|
||||
val queryformatted = query.replace(" ", "+")
|
||||
val url = "$mainUrl/?s=$queryformatted"
|
||||
val doc = app.get(url).document
|
||||
return doc.select("ul.posts > li").map {
|
||||
val title = it.selectFirst("div.title")!!.text().substringBeforeLast("(").substringBeforeLast("[")
|
||||
val link = it.selectFirst("a")!!.attr("href")
|
||||
val image = it.selectFirst("a")!!.attr("data-thumbnail")
|
||||
val quality = getQualityFromString(it.selectFirst("div.hd")?.text())
|
||||
|
||||
MovieSearchResponse(
|
||||
title,
|
||||
link,
|
||||
this.name,
|
||||
quality = quality,
|
||||
posterUrl = image
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
override suspend fun load(url: String): LoadResponse {
|
||||
val document = app.get(url).document
|
||||
val type =
|
||||
if (document.selectFirst("a.taxonomy.category")!!.attr("href").contains("serie-tv")
|
||||
.not()
|
||||
) TvType.Movie else TvType.TvSeries
|
||||
val title = document.selectFirst("#content > h1")!!.text().substringBeforeLast("(")
|
||||
.substringBeforeLast("[")
|
||||
|
||||
val description = document.selectFirst("i.fa.fa-file-text-o.fa-fw")?.parent()?.nextSibling()?.toString()?.parseAsHtml().toString()
|
||||
|
||||
|
||||
val rating = document.selectFirst("div.rating > div.value")?.text()
|
||||
|
||||
val year =
|
||||
document.selectFirst("#content > h1")?.text()?.substringAfterLast("(")?.filter { it.isDigit() }?.toIntOrNull() ?:
|
||||
description.substringAfter("trasmessa nel").take(6).filter { it.isDigit() }.toIntOrNull() ?:
|
||||
(document.selectFirst("i.fa.fa-calendar.fa-fw")?.parent()?.nextSibling() as Element?)?.text()?.substringAfterLast(" ")?.filter { it.isDigit() }?.toIntOrNull()
|
||||
|
||||
|
||||
val poster = document.selectFirst("div.meta > div > img")?.attr("data-src")
|
||||
|
||||
|
||||
val trailerurl = document.selectFirst("div.youtube-player")?.attr("data-id")?.let{ urldata->
|
||||
"https://www.youtube.com/watch?v=$urldata"
|
||||
}
|
||||
|
||||
if (type == TvType.TvSeries) {
|
||||
|
||||
val episodeList = ArrayList<Episode>()
|
||||
document.select("div.accordion-item").filter{it.selectFirst("#season > ul > li.s_title > span")!!.text().isNotEmpty()}.map { element ->
|
||||
val season =
|
||||
element.selectFirst("#season > ul > li.s_title > span")!!.text().toInt()
|
||||
element.select("div.episode-wrap").map { episode ->
|
||||
val href =
|
||||
episode.select("#links > div > div > table > tbody:nth-child(2) > tr")
|
||||
.map { it.selectFirst("a")!!.attr("href") }.toJson()
|
||||
val epNum = episode.selectFirst("li.season-no")!!.text().substringAfter("x")
|
||||
.filter { it.isDigit() }.toIntOrNull()
|
||||
val epTitle = episode.selectFirst("li.other_link > a")?.text()
|
||||
|
||||
val posterUrl = episode.selectFirst("figure > img")?.attr("data-src")
|
||||
episodeList.add(
|
||||
Episode(
|
||||
href,
|
||||
epTitle,
|
||||
season,
|
||||
epNum,
|
||||
posterUrl,
|
||||
)
|
||||
)
|
||||
}
|
||||
}
|
||||
return newTvSeriesLoadResponse(
|
||||
title,
|
||||
url, type, episodeList
|
||||
) {
|
||||
this.posterUrl = poster
|
||||
this.year = year
|
||||
this.plot = description
|
||||
addRating(rating)
|
||||
addTrailer(trailerurl)
|
||||
}
|
||||
} else {
|
||||
|
||||
val urls0 = document.select("div.embed-player")
|
||||
val urls = if (urls0.isNotEmpty()){
|
||||
urls0.map { it.attr("data-id") }.toJson()
|
||||
}
|
||||
else{ document.select("#info > ul > li ").mapNotNull { it.selectFirst("a")?.attr("href") }.toJson() }
|
||||
|
||||
return newMovieLoadResponse(
|
||||
title,
|
||||
url,
|
||||
type,
|
||||
urls
|
||||
) {
|
||||
posterUrl = fixUrlNull(poster)
|
||||
this.year = year
|
||||
this.plot = description
|
||||
addRating(rating)
|
||||
addTrailer(trailerurl)
|
||||
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// to be updated when UnshortenUrl is ready
|
||||
suspend fun unshorten_linkup(uri: String): String {
|
||||
var r: NiceResponse? = null
|
||||
var uri = uri
|
||||
when{
|
||||
uri.contains("/tv/") -> uri = uri.replace("/tv/", "/tva/")
|
||||
uri.contains("delta") -> uri = uri.replace("/delta/", "/adelta/")
|
||||
(uri.contains("/ga/") || uri.contains("/ga2/")) -> uri = base64Decode(uri.split('/').last()).trim()
|
||||
uri.contains("/speedx/") -> uri = uri.replace("http://linkup.pro/speedx", "http://speedvideo.net")
|
||||
else -> {
|
||||
r = app.get(uri, allowRedirects = true)
|
||||
uri = r.url
|
||||
val link =
|
||||
Regex("<iframe[^<>]*src=\\'([^'>]*)\\'[^<>]*>").find(r.text)?.value ?:
|
||||
Regex("""action="(?:[^/]+.*?/[^/]+/([a-zA-Z0-9_]+))">""").find(r.text)?.value ?:
|
||||
Regex("""href","((.|\\n)*?)"""").findAll(r.text).elementAtOrNull(1)?.groupValues?.get(1)
|
||||
|
||||
if (link!=null) {
|
||||
uri = link
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
val short = Regex("""^https?://.*?(https?://.*)""").find(uri)?.value
|
||||
if (short!=null){
|
||||
uri = short
|
||||
}
|
||||
if (r==null){
|
||||
r = app.get(
|
||||
uri,
|
||||
allowRedirects = false)
|
||||
if (r.headers["location"]!= null){
|
||||
uri = r.headers["location"].toString()
|
||||
}
|
||||
}
|
||||
if (uri.contains("snip.")) {
|
||||
if (uri.contains("out_generator")) {
|
||||
uri = Regex("url=(.*)\$").find(uri)!!.value
|
||||
}
|
||||
else if (uri.contains("/decode/")) {
|
||||
uri = app.get(uri, allowRedirects = true).url
|
||||
}
|
||||
}
|
||||
return uri
|
||||
}
|
||||
|
||||
|
||||
override suspend fun loadLinks(
|
||||
data: String,
|
||||
isCasting: Boolean,
|
||||
subtitleCallback: (SubtitleFile) -> Unit,
|
||||
callback: (ExtractorLink) -> Unit
|
||||
): Boolean {
|
||||
tryParseJson<List<String>>(data)?.forEach { id ->
|
||||
if (id.contains("buckler")){
|
||||
val id2 = unshorten_linkup(id).trim().replace("/v/","/e/").replace("/f/","/e/")
|
||||
loadExtractor(id2, data, callback)
|
||||
}
|
||||
else if (id.contains("isecure")){
|
||||
val doc1 = app.get(id).document
|
||||
val id2 = doc1.selectFirst("iframe")!!.attr("src")
|
||||
loadExtractor(id2, data, callback)
|
||||
}
|
||||
else{
|
||||
loadExtractor(id, data, callback)
|
||||
}
|
||||
}
|
||||
return true
|
||||
}
|
||||
}
|
|
@ -9,7 +9,7 @@ import com.lagradost.cloudstream3.LoadResponse.Companion.addTrailer
|
|||
|
||||
class TantifilmProvider : MainAPI() {
|
||||
override var lang = "it"
|
||||
override var mainUrl = "https://www.tantifilm.rodeo"
|
||||
override var mainUrl = "https://www.tantifilm.pics"
|
||||
override var name = "Tantifilm"
|
||||
override val hasMainPage = true
|
||||
override val hasChromecastSupport = true
|
||||
|
|
|
@ -140,6 +140,8 @@ val extractorApis: Array<ExtractorApi> = arrayOf(
|
|||
//mixdrop extractors
|
||||
MixDropBz(),
|
||||
MixDropCh(),
|
||||
MixDropTo(),
|
||||
|
||||
MixDrop(),
|
||||
|
||||
Mcloud(),
|
||||
|
@ -186,6 +188,7 @@ val extractorApis: Array<ExtractorApi> = arrayOf(
|
|||
DoodLaExtractor(),
|
||||
DoodWsExtractor(),
|
||||
DoodShExtractor(),
|
||||
DoodWatchExtractor(),
|
||||
|
||||
AsianLoad(),
|
||||
|
||||
|
|
|
@ -184,6 +184,12 @@
|
|||
"status": 1,
|
||||
"url": "https://filman.cc"
|
||||
},
|
||||
"FilmpertuttiProvider": {
|
||||
"language": "it",
|
||||
"name": "Filmpertutti",
|
||||
"status": 1,
|
||||
"url": "https://www.filmpertutti.buzz"
|
||||
},
|
||||
"FmoviesToProvider": {
|
||||
"language": "en",
|
||||
"name": "Fmovies.to",
|
||||
|
@ -420,7 +426,7 @@
|
|||
"language": "it",
|
||||
"name": "Tantifilm",
|
||||
"status": 1,
|
||||
"url": "https://www.tantifilm.rodeo"
|
||||
"url": "https://www.tantifilm.pics"
|
||||
},
|
||||
"TenshiProvider": {
|
||||
"language": "en",
|
||||
|
|
Loading…
Reference in a new issue