mirror of
https://github.com/recloudstream/cloudstream.git
synced 2024-08-15 01:53:11 +00:00
mainApi changes
This commit is contained in:
parent
641025fa2d
commit
f4d160f997
13 changed files with 94 additions and 65 deletions
|
@ -698,25 +698,25 @@ data class TvSeriesSearchResponse(
|
|||
) : SearchResponse
|
||||
|
||||
interface LoadResponse {
|
||||
val name: String
|
||||
val url: String
|
||||
val apiName: String
|
||||
val type: TvType
|
||||
var name: String
|
||||
var url: String
|
||||
var apiName: String
|
||||
var type: TvType
|
||||
var posterUrl: String?
|
||||
val year: Int?
|
||||
var year: Int?
|
||||
var plot: String?
|
||||
var rating: Int? // 1-1000
|
||||
var tags: List<String>?
|
||||
var duration: Int? // in minutes
|
||||
var trailerUrl: String?
|
||||
var trailers: List<String>?
|
||||
var recommendations: List<SearchResponse>?
|
||||
var actors: List<ActorData>?
|
||||
var comingSoon: Boolean
|
||||
var syncData: MutableMap<String, String>
|
||||
|
||||
companion object {
|
||||
val malIdPrefix = malApi.idPrefix
|
||||
val aniListIdPrefix = aniListApi.idPrefix
|
||||
private val malIdPrefix = malApi.idPrefix
|
||||
private val aniListIdPrefix = aniListApi.idPrefix
|
||||
|
||||
@JvmName("addActorNames")
|
||||
fun LoadResponse.addActors(actors: List<String>?) {
|
||||
|
@ -750,6 +750,18 @@ interface LoadResponse {
|
|||
addImdbId(imdbUrlToIdNullable(url))
|
||||
}
|
||||
|
||||
/**better to set trailers directly instead of calling this multiple times*/
|
||||
fun LoadResponse.addTrailer(trailerUrl: String?) {
|
||||
if (trailerUrl == null) return
|
||||
if (this.trailers == null) {
|
||||
this.trailers = listOf(trailerUrl)
|
||||
} else {
|
||||
val update = this.trailers?.toMutableList()
|
||||
update?.add(trailerUrl)
|
||||
this.trailers = update
|
||||
}
|
||||
}
|
||||
|
||||
fun LoadResponse.addImdbId(id: String?) {
|
||||
// TODO add imdb sync
|
||||
}
|
||||
|
@ -763,10 +775,21 @@ interface LoadResponse {
|
|||
}
|
||||
|
||||
fun LoadResponse.addTMDbId(id: String?) {
|
||||
|
||||
// TODO add TMDb sync
|
||||
}
|
||||
|
||||
fun LoadResponse.setDuration(input: String?) {
|
||||
fun LoadResponse.addRating(text: String?) {
|
||||
addRating(text.toRatingInt())
|
||||
}
|
||||
|
||||
fun LoadResponse.addRating(value: Int?) {
|
||||
if (value ?: return < 0 || value > 1000) {
|
||||
return
|
||||
}
|
||||
this.rating = value
|
||||
}
|
||||
|
||||
fun LoadResponse.addDuration(input: String?) {
|
||||
val cleanInput = input?.trim()?.replace(" ", "") ?: return
|
||||
Regex("([0-9]*)h.*?([0-9]*)m").find(cleanInput)?.groupValues?.let { values ->
|
||||
if (values.size == 3) {
|
||||
|
@ -816,7 +839,7 @@ data class TorrentLoadResponse(
|
|||
override var rating: Int? = null,
|
||||
override var tags: List<String>? = null,
|
||||
override var duration: Int? = null,
|
||||
override var trailerUrl: String? = null,
|
||||
override var trailers: List<String>? = null,
|
||||
override var recommendations: List<SearchResponse>? = null,
|
||||
override var actors: List<ActorData>? = null,
|
||||
override var comingSoon: Boolean = false,
|
||||
|
@ -843,7 +866,7 @@ data class AnimeLoadResponse(
|
|||
|
||||
override var rating: Int? = null,
|
||||
override var duration: Int? = null,
|
||||
override var trailerUrl: String? = null,
|
||||
override var trailers: List<String>? = null,
|
||||
override var recommendations: List<SearchResponse>? = null,
|
||||
override var actors: List<ActorData>? = null,
|
||||
override var comingSoon: Boolean = false,
|
||||
|
@ -898,7 +921,7 @@ data class MovieLoadResponse(
|
|||
override var rating: Int? = null,
|
||||
override var tags: List<String>? = null,
|
||||
override var duration: Int? = null,
|
||||
override var trailerUrl: String? = null,
|
||||
override var trailers: List<String>? = null,
|
||||
override var recommendations: List<SearchResponse>? = null,
|
||||
override var actors: List<ActorData>? = null,
|
||||
override var comingSoon: Boolean = false,
|
||||
|
@ -912,6 +935,14 @@ fun <T> MainAPI.newMovieLoadResponse(
|
|||
data: T?,
|
||||
initializer: MovieLoadResponse.() -> Unit = { }
|
||||
): MovieLoadResponse {
|
||||
// just in case
|
||||
if (data is String) return newMovieLoadResponse(
|
||||
name,
|
||||
url,
|
||||
type,
|
||||
dataUrl = data,
|
||||
initializer = initializer
|
||||
)
|
||||
val dataUrl = data?.toJson() ?: ""
|
||||
val builder = MovieLoadResponse(
|
||||
name = name,
|
||||
|
@ -955,9 +986,9 @@ data class Episode(
|
|||
var date: Long? = null,
|
||||
)
|
||||
|
||||
fun Episode.addDate(date: String?, fomat: String = "yyyy-MM-dd") {
|
||||
fun Episode.addDate(date: String?, format: String = "yyyy-MM-dd") {
|
||||
try {
|
||||
this.date = SimpleDateFormat(fomat)?.parse(date ?: return)?.time
|
||||
this.date = SimpleDateFormat(format)?.parse(date ?: return)?.time
|
||||
} catch (e: Exception) {
|
||||
logError(e)
|
||||
}
|
||||
|
@ -967,7 +998,7 @@ fun Episode.addDate(date: Date?) {
|
|||
this.date = date?.time
|
||||
}
|
||||
|
||||
fun <T> MainAPI.newEpisode(
|
||||
fun MainAPI.newEpisode(
|
||||
url: String,
|
||||
initializer: Episode.() -> Unit = { },
|
||||
fix: Boolean = true,
|
||||
|
@ -983,6 +1014,11 @@ fun <T> MainAPI.newEpisode(
|
|||
data: T,
|
||||
initializer: Episode.() -> Unit = { }
|
||||
): Episode {
|
||||
if (data is String) return newEpisode(
|
||||
url = data,
|
||||
initializer = initializer
|
||||
) // just in case java is wack
|
||||
|
||||
val builder = Episode(
|
||||
data = data?.toJson() ?: throw ErrorLoadingException("invalid newEpisode")
|
||||
)
|
||||
|
@ -1005,7 +1041,7 @@ data class TvSeriesLoadResponse(
|
|||
override var rating: Int? = null,
|
||||
override var tags: List<String>? = null,
|
||||
override var duration: Int? = null,
|
||||
override var trailerUrl: String? = null,
|
||||
override var trailers: List<String>? = null,
|
||||
override var recommendations: List<SearchResponse>? = null,
|
||||
override var actors: List<ActorData>? = null,
|
||||
override var comingSoon: Boolean = false,
|
||||
|
@ -1041,4 +1077,4 @@ fun fetchUrls(text: String?): List<String> {
|
|||
}
|
||||
|
||||
fun String?.toRatingInt(): Int? =
|
||||
this?.trim()?.toDoubleOrNull()?.absoluteValue?.times(1000f)?.toInt()
|
||||
this?.replace(" ", "")?.trim()?.toDoubleOrNull()?.absoluteValue?.times(1000f)?.toInt()
|
||||
|
|
|
@ -5,6 +5,7 @@ import com.fasterxml.jackson.module.kotlin.readValue
|
|||
import com.lagradost.cloudstream3.*
|
||||
import com.lagradost.cloudstream3.LoadResponse.Companion.addAniListId
|
||||
import com.lagradost.cloudstream3.LoadResponse.Companion.addMalId
|
||||
import com.lagradost.cloudstream3.LoadResponse.Companion.addTrailer
|
||||
import com.lagradost.cloudstream3.mvvm.suspendSafeApiCall
|
||||
import com.lagradost.cloudstream3.network.AppResponse
|
||||
import com.lagradost.cloudstream3.utils.ExtractorLink
|
||||
|
@ -306,7 +307,7 @@ class AnimePaheProvider : MainAPI() {
|
|||
|
||||
addMalId(malId)
|
||||
addAniListId(anilistId)
|
||||
this.trailerUrl = trailer
|
||||
addTrailer(trailer)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -3,6 +3,8 @@ package com.lagradost.cloudstream3.animeproviders
|
|||
import com.lagradost.cloudstream3.*
|
||||
import com.lagradost.cloudstream3.LoadResponse.Companion.addAniListId
|
||||
import com.lagradost.cloudstream3.LoadResponse.Companion.addMalId
|
||||
import com.lagradost.cloudstream3.LoadResponse.Companion.addRating
|
||||
import com.lagradost.cloudstream3.LoadResponse.Companion.addTrailer
|
||||
import com.lagradost.cloudstream3.utils.ExtractorLink
|
||||
import com.lagradost.cloudstream3.utils.Qualities
|
||||
import org.json.JSONObject
|
||||
|
@ -123,7 +125,7 @@ class AnimeWorldProvider : MainAPI() {
|
|||
|
||||
val type: TvType = getType(widget.select("dd").first()?.text())
|
||||
val genres = widget.select(".meta").select("a[href*=\"/genre/\"]").map { it.text() }
|
||||
val rating: Int? = widget.select("#average-vote").text().toFloatOrNull()?.times(1000)?.toInt()
|
||||
val rating = widget.select("#average-vote")?.text()
|
||||
|
||||
val trailerUrl = document.select(".trailer[data-url]").attr("data-url")
|
||||
val malId = document.select("#mal-button").attr("href")
|
||||
|
@ -174,9 +176,9 @@ class AnimeWorldProvider : MainAPI() {
|
|||
tags = genres
|
||||
addMalId(malId)
|
||||
addAniListId(anlId)
|
||||
this.rating = rating
|
||||
addRating(rating)
|
||||
this.duration = duration
|
||||
this.trailerUrl = trailerUrl
|
||||
addTrailer(trailerUrl)
|
||||
this.recommendations = recommendations
|
||||
this.comingSoon = comingSoon
|
||||
}
|
||||
|
|
|
@ -2,6 +2,7 @@ package com.lagradost.cloudstream3.metaproviders
|
|||
|
||||
import com.lagradost.cloudstream3.*
|
||||
import com.lagradost.cloudstream3.LoadResponse.Companion.addAniListId
|
||||
import com.lagradost.cloudstream3.LoadResponse.Companion.addTrailer
|
||||
import com.lagradost.cloudstream3.syncproviders.OAuth2API
|
||||
|
||||
class MultiAnimeProvider : MainAPI() {
|
||||
|
@ -36,7 +37,7 @@ class MultiAnimeProvider : MainAPI() {
|
|||
plot = res.synopsis
|
||||
tags = res.genres
|
||||
rating = res.publicScore
|
||||
trailerUrl = res.trailerUrl
|
||||
addTrailer(res.trailerUrl)
|
||||
addAniListId(res.id.toIntOrNull())
|
||||
}
|
||||
}
|
||||
|
|
|
@ -97,9 +97,7 @@ class AkwamProvider : MainAPI() {
|
|||
|
||||
val synopsis = doc.select("div.widget-body p:first-child").text()
|
||||
|
||||
val rating = doc.select("span.mx-2").text().split("/").lastOrNull()?.replace(" ", "")
|
||||
?.toDoubleOrNull()
|
||||
?.times(1000)?.toInt()
|
||||
val rating = doc.select("span.mx-2").text().split("/").lastOrNull()?.toRatingInt()
|
||||
|
||||
val tags = doc.select("div.font-size-16.d-flex.align-items-center.mt-3 > a").map {
|
||||
it.text()
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
package com.lagradost.cloudstream3.movieproviders
|
||||
|
||||
import com.lagradost.cloudstream3.*
|
||||
import com.lagradost.cloudstream3.LoadResponse.Companion.setDuration
|
||||
import com.lagradost.cloudstream3.LoadResponse.Companion.addDuration
|
||||
import com.lagradost.cloudstream3.mvvm.logError
|
||||
import com.lagradost.cloudstream3.utils.ExtractorLink
|
||||
import com.lagradost.cloudstream3.utils.loadExtractor
|
||||
|
@ -111,8 +111,7 @@ class AllMoviesForYouProvider : MainAPI() {
|
|||
val title = document.selectFirst("h1.Title").text()
|
||||
val descipt = document.selectFirst("div.Description > p").text()
|
||||
val rating =
|
||||
document.selectFirst("div.Vote > div.post-ratings > span")?.text()?.toFloatOrNull()
|
||||
?.times(1000)?.toInt()
|
||||
document.selectFirst("div.Vote > div.post-ratings > span")?.text()?.toRatingInt()
|
||||
val year = document.selectFirst("span.Date")?.text()
|
||||
val duration = document.selectFirst("span.Time").text()
|
||||
val backgroundPoster =
|
||||
|
@ -180,7 +179,7 @@ class AllMoviesForYouProvider : MainAPI() {
|
|||
this.year = year?.toIntOrNull()
|
||||
this.plot = descipt
|
||||
this.rating = rating
|
||||
setDuration(duration)
|
||||
addDuration(duration)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -265,8 +265,7 @@ open class BflixProvider() : MainAPI() {
|
|||
year = null
|
||||
)
|
||||
}
|
||||
val rating = soup.selectFirst(".info span.imdb").text().toFloatOrNull()
|
||||
?.times(1000)?.toInt()
|
||||
val rating = soup.selectFirst(".info span.imdb")?.text()?.toRatingInt()
|
||||
val durationdoc = soup.selectFirst("div.info div.meta").toString()
|
||||
val durationregex = Regex("((\\d+) min)")
|
||||
val yearegex = Regex("<span>(\\d+)<\\/span>")
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
package com.lagradost.cloudstream3.movieproviders
|
||||
|
||||
import com.lagradost.cloudstream3.*
|
||||
import com.lagradost.cloudstream3.LoadResponse.Companion.setDuration
|
||||
import com.lagradost.cloudstream3.LoadResponse.Companion.addDuration
|
||||
import com.lagradost.cloudstream3.mvvm.logError
|
||||
import com.lagradost.cloudstream3.utils.ExtractorLink
|
||||
import com.lagradost.cloudstream3.utils.loadExtractor
|
||||
|
@ -175,7 +175,7 @@ class PelisflixProvider : MainAPI() {
|
|||
this.year = year?.toIntOrNull()
|
||||
this.plot = descipt
|
||||
this.rating = rating
|
||||
setDuration(duration)
|
||||
addDuration(duration)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
package com.lagradost.cloudstream3.movieproviders
|
||||
|
||||
import com.lagradost.cloudstream3.*
|
||||
import com.lagradost.cloudstream3.LoadResponse.Companion.setDuration
|
||||
import com.lagradost.cloudstream3.LoadResponse.Companion.addDuration
|
||||
import com.lagradost.cloudstream3.mvvm.logError
|
||||
import com.lagradost.cloudstream3.utils.ExtractorLink
|
||||
import com.lagradost.cloudstream3.utils.loadExtractor
|
||||
|
@ -92,8 +92,7 @@ class SeriesflixProvider : MainAPI() {
|
|||
val descRegex = Regex("(Recuerda.*Seriesflix.)")
|
||||
val descipt = document.selectFirst("div.Description > p").text().replace(descRegex, "")
|
||||
val rating =
|
||||
document.selectFirst("div.Vote > div.post-ratings > span")?.text()?.toFloatOrNull()
|
||||
?.times(1000)?.toInt()
|
||||
document.selectFirst("div.Vote > div.post-ratings > span")?.text()?.toRatingInt()
|
||||
val year = document.selectFirst("span.Date")?.text()
|
||||
// ?: does not work
|
||||
val duration = try {
|
||||
|
@ -172,7 +171,7 @@ class SeriesflixProvider : MainAPI() {
|
|||
this.year = year?.toIntOrNull()
|
||||
this.plot = descipt
|
||||
this.rating = rating
|
||||
setDuration(duration)
|
||||
addDuration(duration)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -6,7 +6,8 @@ import com.lagradost.cloudstream3.*
|
|||
import com.lagradost.cloudstream3.APIHolder.getCaptchaToken
|
||||
import com.lagradost.cloudstream3.APIHolder.unixTimeMS
|
||||
import com.lagradost.cloudstream3.LoadResponse.Companion.addActors
|
||||
import com.lagradost.cloudstream3.LoadResponse.Companion.setDuration
|
||||
import com.lagradost.cloudstream3.LoadResponse.Companion.addDuration
|
||||
import com.lagradost.cloudstream3.LoadResponse.Companion.addTrailer
|
||||
import com.lagradost.cloudstream3.animeproviders.ZoroProvider
|
||||
import com.lagradost.cloudstream3.mvvm.suspendSafeApiCall
|
||||
import com.lagradost.cloudstream3.network.AppResponse
|
||||
|
@ -217,12 +218,12 @@ open class SflixProvider : MainAPI() {
|
|||
this.year = year
|
||||
this.posterUrl = posterUrl
|
||||
this.plot = plot
|
||||
setDuration(duration)
|
||||
addDuration(duration)
|
||||
addActors(cast)
|
||||
this.tags = tags
|
||||
this.recommendations = recommendations
|
||||
this.comingSoon = comingSoon
|
||||
this.trailerUrl = youtubeTrailer
|
||||
addTrailer(youtubeTrailer)
|
||||
this.rating = rating
|
||||
}
|
||||
} else {
|
||||
|
@ -273,11 +274,11 @@ open class SflixProvider : MainAPI() {
|
|||
this.posterUrl = posterUrl
|
||||
this.year = year
|
||||
this.plot = plot
|
||||
setDuration(duration)
|
||||
addDuration(duration)
|
||||
addActors(cast)
|
||||
this.tags = tags
|
||||
this.recommendations = recommendations
|
||||
this.trailerUrl = youtubeTrailer
|
||||
addTrailer(youtubeTrailer)
|
||||
this.rating = rating
|
||||
}
|
||||
}
|
||||
|
|
|
@ -1,6 +1,8 @@
|
|||
package com.lagradost.cloudstream3.movieproviders
|
||||
|
||||
import com.lagradost.cloudstream3.*
|
||||
import com.lagradost.cloudstream3.LoadResponse.Companion.addRating
|
||||
import com.lagradost.cloudstream3.LoadResponse.Companion.addTrailer
|
||||
import com.lagradost.cloudstream3.utils.ExtractorLink
|
||||
import com.lagradost.cloudstream3.utils.extractorApis
|
||||
|
||||
|
@ -61,33 +63,24 @@ class FrenchStreamProvider : MainAPI() {
|
|||
val listEpisode = soup.select("div.elink")
|
||||
|
||||
if (isMovie) {
|
||||
val trailer = soup.selectFirst("div.fleft > span > a")?.attr("href")
|
||||
val date = soup.select("ul.flist-col > li")?.getOrNull(2)?.text()?.toIntOrNull()
|
||||
val ratingAverage = soup.select("div.fr-count > div")?.text()?.toIntOrNull()
|
||||
val tags = soup.select("ul.flist-col > li")?.getOrNull(1)
|
||||
val tagsList = tags?.select("a")
|
||||
?.mapNotNull { // all the tags like action, thriller ...; unused variable
|
||||
it?.text()
|
||||
}
|
||||
return MovieLoadResponse(
|
||||
title,
|
||||
url,
|
||||
this.name,
|
||||
TvType.Movie,
|
||||
url,
|
||||
poster,
|
||||
date,
|
||||
description,
|
||||
ratingAverage,
|
||||
tagsList,
|
||||
null,
|
||||
trailer
|
||||
)
|
||||
return newMovieLoadResponse(title,url,TvType.Movie,url) {
|
||||
this.posterUrl = poster
|
||||
addRating(soup.select("div.fr-count > div")?.text())
|
||||
this.year = soup.select("ul.flist-col > li")?.getOrNull(2)?.text()?.toIntOrNull()
|
||||
this.tags = tagsList
|
||||
this.plot = description
|
||||
addTrailer(soup.selectFirst("div.fleft > span > a")?.attr("href"))
|
||||
}
|
||||
} else // a tv serie
|
||||
{
|
||||
//println(listEpisode)
|
||||
//println("listeEpisode:")
|
||||
val episode_list = if ("<a" !in (listEpisode[0]).toString()) { // check if VF is empty
|
||||
val episodeList = if ("<a" !in (listEpisode[0]).toString()) { // check if VF is empty
|
||||
listEpisode[1] // no vf, return vostfr
|
||||
}
|
||||
else {
|
||||
|
@ -96,7 +89,7 @@ class FrenchStreamProvider : MainAPI() {
|
|||
|
||||
//println(url)
|
||||
|
||||
val episodes = episode_list.select("a").map { a ->
|
||||
val episodes = episodeList.select("a").map { a ->
|
||||
val epNum = a.text().split("Episode")[1].trim().toIntOrNull()
|
||||
val epTitle = if (a.text()?.toString() != null)
|
||||
if (a.text().contains("Episode")) {
|
||||
|
@ -131,8 +124,6 @@ class FrenchStreamProvider : MainAPI() {
|
|||
null,
|
||||
description,
|
||||
ShowStatus.Ongoing,
|
||||
null,
|
||||
null
|
||||
)
|
||||
}
|
||||
}
|
||||
|
|
|
@ -10,6 +10,7 @@ import com.lagradost.cloudstream3.APIHolder.getApiFromNameNull
|
|||
import com.lagradost.cloudstream3.APIHolder.getApiFromUrlNull
|
||||
import com.lagradost.cloudstream3.APIHolder.getId
|
||||
import com.lagradost.cloudstream3.AcraApplication.Companion.setKey
|
||||
import com.lagradost.cloudstream3.LoadResponse.Companion.addTrailer
|
||||
import com.lagradost.cloudstream3.mvvm.Resource
|
||||
import com.lagradost.cloudstream3.mvvm.safeApiCall
|
||||
import com.lagradost.cloudstream3.syncproviders.SyncAPI
|
||||
|
@ -123,7 +124,7 @@ class ResultViewModel : ViewModel() {
|
|||
rating = rating ?: meta.publicScore
|
||||
tags = tags ?: meta.genres
|
||||
plot = if (plot.isNullOrBlank()) meta.synopsis else plot
|
||||
trailerUrl = trailerUrl ?: meta.trailerUrl
|
||||
addTrailer(meta.trailerUrl)
|
||||
posterUrl = posterUrl ?: meta.posterUrl ?: meta.backgroundPosterUrl
|
||||
actors = actors ?: meta.actors
|
||||
}
|
||||
|
|
|
@ -222,6 +222,7 @@ object AppUtils {
|
|||
|
||||
/** Any object as json string */
|
||||
fun Any.toJson(): String {
|
||||
if(this is String) return this
|
||||
return mapper.writeValueAsString(this)
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in a new issue