exts: Small Refactor.

This commit is contained in:
CakesTwix 2023-08-04 15:14:23 +03:00
parent 0c70c755f0
commit e6db533c71
Signed by: CakesTwix
GPG key ID: 7B11051D5CE19825
18 changed files with 78 additions and 56 deletions

View file

@ -1,5 +1,5 @@
// use an integer for version numbers
version = 3
version = 4
cloudstream {

View file

@ -62,6 +62,8 @@ class AnimeUAProvider : MainAPI() {
val title = this.selectFirst(titleSelector)?.text()?.trim().toString()
val href = this.selectFirst(hrefSelector)?.attr("href").toString()
val posterUrl = mainUrl + this.selectFirst(posterSelector)?.attr("data-src")
// TODO: Use it
val status = this.select(".poster__label").text()
return newAnimeSearchResponse(title, href, TvType.Anime) {
this.posterUrl = posterUrl
@ -118,7 +120,7 @@ class AnimeUAProvider : MainAPI() {
// Return to app
// Parse Episodes as Series
return if (tvType == TvType.Anime || tvType == TvType.OVA) {
var episodes: List<Episode> = emptyList()
val episodes = mutableListOf<Episode>()
val playerRawJson = app.get(playerUrl).document.select("script").html()
.substringAfterLast("file:\'")
.substringBefore("\',")
@ -126,7 +128,7 @@ class AnimeUAProvider : MainAPI() {
tryParseJson<List<PlayerJson>>(playerRawJson)?.map { dubs -> // Dubs
for(season in dubs.folder){ // Seasons
for(episode in season.folder){ // Episodes
episodes = episodes.plus(
episodes.add(
Episode(
"${season.title}, ${episode.title}, $playerUrl",
episode.title,

View file

@ -1,5 +1,5 @@
// use an integer for version numbers
version = 2
version = 3
dependencies {
implementation("com.google.code.gson:gson:2.9.0")

View file

@ -121,15 +121,15 @@ class BambooUAProvider : MainAPI() {
it.toSearchResponse()
}
var subEpisodes: List<Episode> = emptyList()
var dubEpisodes: List<Episode> = emptyList()
val subEpisodes = mutableListOf<Episode>()
val dubEpisodes = mutableListOf<Episode>()
// Parse episodes (sub/dub)
document.select(".mt-4").forEach {
// Parse sub
if(it.select("h3.my-4").text() == "Субтитри"){
it.select("span.play_me").forEach{ episode ->
subEpisodes = subEpisodes.plus(
subEpisodes.add(
Episode(
episode.attr("data-file"),
episode.attr("data-title"),
@ -140,7 +140,7 @@ class BambooUAProvider : MainAPI() {
// Parse dub
} else if(it.select("h3.my-4").text() == "Озвучення"){
it.select("span.play_me").forEach{ episode ->
dubEpisodes = dubEpisodes.plus(
dubEpisodes.add(
Episode(
episode.attr("data-file"),
episode.attr("data-title"),

View file

@ -1,5 +1,5 @@
// use an integer for version numbers
version = 1
version = 2
cloudstream {

View file

@ -36,7 +36,7 @@ class EneyidaProvider : MainAPI() {
page: Int,
request: MainPageRequest
): HomePageResponse {
var document = app.get(request.data + page).document
val document = app.get(request.data + page).document
val home = document.select("article.short").map {
it.toSearchResponse()
@ -57,7 +57,7 @@ class EneyidaProvider : MainAPI() {
override suspend fun search(query: String): List<SearchResponse> {
val document = app.post(
url = "$mainUrl",
url = mainUrl,
data = mapOf(
"do" to "search",
"subaction" to "search",
@ -74,18 +74,18 @@ class EneyidaProvider : MainAPI() {
override suspend fun load(url: String): LoadResponse {
val document = app.get(url).document
// Parse info
val full_info = document.select(".full_info li")
val fullInfo = document.select(".full_info li")
val title = document.selectFirst("div.full_header-title h1")?.text()?.trim().toString()
val poster = mainUrl + document.selectFirst(".full_content-poster img")?.attr("src")
val tags = full_info[1].select("a").map { it.text() }
val year = full_info[0].select("a").text().toIntOrNull()
val tags = fullInfo[1].select("a").map { it.text() }
val year = fullInfo[0].select("a").text().toIntOrNull()
val playerUrl = document.select(".tabs_b.visible iframe").attr("src")
val tvType = if (tags.contains("фільм") or playerUrl.contains("/vod/")) TvType.Movie else TvType.TvSeries
val description = document.selectFirst(".full_content-desc p")?.text()?.trim()
val trailer = document.selectFirst("div#trailer_place iframe")?.attr("src").toString()
val rating = document.selectFirst(".r_kp span, .r_imdb span")?.text().toRatingInt()
val actors = full_info[4].select("a").map { it.text() }
val actors = fullInfo[4].select("a").map { it.text() }
val recommendations = document.select(".short.related_item").map {
it.toSearchResponse()
@ -94,7 +94,7 @@ class EneyidaProvider : MainAPI() {
// Return to app
// Parse Episodes as Series
return if (tvType == TvType.TvSeries) {
var episodes: List<Episode> = emptyList()
val episodes = mutableListOf<Episode>()
val playerRawJson = app.get(playerUrl).document.select("script").html()
.substringAfterLast("file:\'")
.substringBefore("\',")
@ -102,7 +102,7 @@ class EneyidaProvider : MainAPI() {
tryParseJson<List<PlayerJson>>(playerRawJson)?.map { dubs -> // Dubs
for(season in dubs.folder){ // Seasons
for(episode in season.folder){ // Episodes
episodes = episodes.plus(
episodes.add(
Episode(
"${season.title}, ${episode.title}, $playerUrl",
episode.title,

View file

@ -1,5 +1,5 @@
// use an integer for version numbers
version = 1
version = 2
cloudstream {

View file

@ -1,12 +1,25 @@
package com.lagradost
import android.util.Log
import com.lagradost.cloudstream3.*
import com.lagradost.models.PlayerJson
import com.lagradost.cloudstream3.Episode
import com.lagradost.cloudstream3.HomePageResponse
import com.lagradost.cloudstream3.LoadResponse
import com.lagradost.cloudstream3.MainAPI
import com.lagradost.cloudstream3.MainPageRequest
import com.lagradost.cloudstream3.SearchResponse
import com.lagradost.cloudstream3.SubtitleFile
import com.lagradost.cloudstream3.TvType
import com.lagradost.cloudstream3.app
import com.lagradost.cloudstream3.mainPageOf
import com.lagradost.cloudstream3.newHomePageResponse
import com.lagradost.cloudstream3.newMovieLoadResponse
import com.lagradost.cloudstream3.newMovieSearchResponse
import com.lagradost.cloudstream3.newTvSeriesLoadResponse
import com.lagradost.cloudstream3.toRatingInt
import com.lagradost.cloudstream3.utils.AppUtils
import com.lagradost.cloudstream3.utils.ExtractorLink
import com.lagradost.cloudstream3.utils.M3u8Helper
import com.lagradost.cloudstream3.utils.Qualities
import com.lagradost.models.PlayerJson
import org.jsoup.nodes.Element
class KinoTronProvider : MainAPI() {
@ -80,7 +93,7 @@ class KinoTronProvider : MainAPI() {
// Parse info
val title = document.select(".full h1").text()
val poster = mainUrl + document.select(".img-box img").attr("data-src")
var tags = document.select(".flist li")[2].select("a").map { it.text() }
val tags = document.select(".flist li")[2].select("a").map { it.text() }
val year = document.select(".flist li")[0].select("a").text().toIntOrNull()
@ -99,14 +112,13 @@ class KinoTronProvider : MainAPI() {
val rating = document.selectFirst(".fqualityimdb")?.text().toRatingInt()
// Parse episodes
var episodes: List<Episode> = emptyList()
val episodes = mutableListOf<Episode>()
val playerUrl = document.select("div.video-box iframe").attr("data-src")
if (playerUrl.contains("/vod/")) { tvType = TvType.Movie }
Log.d("load-debug", playerUrl)
// Return to app
// Parse Episodes as Series
return if (tvType == TvType.TvSeries || tvType == TvType.Anime) {
var episodes: List<Episode> = emptyList()
val playerRawJson = app.get(playerUrl).document.select("script").html()
.substringAfterLast("file:\'")
.substringBefore("\',")
@ -114,7 +126,7 @@ class KinoTronProvider : MainAPI() {
AppUtils.tryParseJson<List<PlayerJson>>(playerRawJson)?.map { dubs -> // Dubs
for(season in dubs.folder){ // Seasons
for(episode in season.folder){ // Episodes
episodes = episodes.plus(
episodes.add(
Episode(
"${season.title}, ${episode.title}, $playerUrl",
episode.title,

View file

@ -1,5 +1,5 @@
// use an integer for version numbers
version = 1
version = 2
cloudstream {

View file

@ -88,13 +88,12 @@ class KinoVezhaProvider : MainAPI() {
val rating = document.selectFirst(".dd-imdb-colours")?.text().toRatingInt()
// Parse episodes
var episodes: List<Episode> = emptyList()
val episodes = mutableListOf<Episode>()
val playerUrl = document.select(".video-responsive > iframe").attr("src")
// Return to app
// Parse Episodes as Series
return if (tvType == TvType.TvSeries) {
var episodes: List<Episode> = emptyList()
val playerRawJson = app.get(playerUrl).document.select("script").html()
.substringAfterLast("file:\'")
.substringBefore("\',")
@ -102,7 +101,7 @@ class KinoVezhaProvider : MainAPI() {
AppUtils.tryParseJson<List<PlayerJson>>(playerRawJson)?.map { dubs -> // Dubs
for(season in dubs.folder){ // Seasons
for(episode in season.folder){ // Episodes
episodes = episodes.plus(
episodes.add(
Episode(
"${season.title}, ${episode.title}, $playerUrl",
episode.title,

View file

@ -1,5 +1,5 @@
// use an integer for version numbers
version = 1
version = 2
cloudstream {

View file

@ -124,7 +124,7 @@ class KlonTVProvider : MainAPI() {
// Return to app
// Parse Episodes as Series
return if (tvType != TvType.Movie) {
var episodes: List<Episode> = emptyList()
val episodes = mutableListOf<Episode>()
val playerRawJson = app.get(playerUrl).document.select("script").html()
.substringAfterLast("file:\'")
.substringBefore("\',")
@ -132,7 +132,7 @@ class KlonTVProvider : MainAPI() {
tryParseJson<List<PlayerJson>>(playerRawJson)?.map { dubs -> // Dubs
for(season in dubs.folder){ // Seasons
for(episode in season.folder){ // Episodes
episodes = episodes.plus(
episodes.add(
Episode(
"${season.title}, ${episode.title}, $playerUrl",
episode.title,

View file

@ -1,5 +1,5 @@
// use an integer for version numbers
version = 1
version = 2
cloudstream {

View file

@ -1,12 +1,23 @@
package com.lagradost
import android.util.Log
import com.lagradost.cloudstream3.*
import com.lagradost.models.PlayerJson
import com.lagradost.cloudstream3.Episode
import com.lagradost.cloudstream3.HomePageResponse
import com.lagradost.cloudstream3.LoadResponse
import com.lagradost.cloudstream3.MainAPI
import com.lagradost.cloudstream3.MainPageRequest
import com.lagradost.cloudstream3.SearchResponse
import com.lagradost.cloudstream3.SubtitleFile
import com.lagradost.cloudstream3.TvType
import com.lagradost.cloudstream3.app
import com.lagradost.cloudstream3.mainPageOf
import com.lagradost.cloudstream3.newHomePageResponse
import com.lagradost.cloudstream3.newMovieSearchResponse
import com.lagradost.cloudstream3.newTvSeriesLoadResponse
import com.lagradost.cloudstream3.toRatingInt
import com.lagradost.cloudstream3.utils.AppUtils
import com.lagradost.cloudstream3.utils.ExtractorLink
import com.lagradost.cloudstream3.utils.M3u8Helper
import com.lagradost.cloudstream3.utils.Qualities
import com.lagradost.models.PlayerJson
import org.jsoup.nodes.Element
class SerialnoProvider : MainAPI() {
@ -81,20 +92,21 @@ class SerialnoProvider : MainAPI() {
val title = document.select(".full h1").text()
val poster = document.select(".fposter a").attr("href")
val tags = mutableListOf<String>()
// Can be smaller
if (generalInfo.size > 4) {
var tags = document.select(".flist li")[4].select("a").map { it.text() }
document.select(".flist li")[4].select("a").map { tags.add(it.text()) }
} else {
var tags = document.select(".flist li")[3].select("a").map { it.text() }
document.select(".flist li")[3].select("a").map { tags.add(it.text()) }
}
val year = document.select(".flist li")[1].select("a").text().toIntOrNull()
var tvType = TvType.TvSeries
val tvType = TvType.TvSeries
val description = document.select(".full-text").text()
// val author = someInfo.select("strong:contains(Студія:)").next().html()
val rating = document.selectFirst(".th-voice")?.text().toRatingInt()
// Parse episodes
var episodes: List<Episode> = emptyList()
val episodes = mutableListOf<Episode>()
val playerUrl = document.select("div.video-box iframe").attr("src")
// Return to app
@ -106,7 +118,7 @@ class SerialnoProvider : MainAPI() {
AppUtils.tryParseJson<List<PlayerJson>>(playerRawJson)?.map { dubs -> // Dubs
for (season in dubs.folder) { // Seasons
for (episode in season.folder) { // Episodes
episodes = episodes.plus(
episodes.add(
Episode(
"${season.title}, ${episode.title}, $playerUrl",
episode.title,

View file

@ -1,5 +1,5 @@
// use an integer for version numbers
version = 3
version = 4
dependencies {
implementation("com.google.code.gson:gson:2.9.0")

View file

@ -1,11 +1,8 @@
package com.lagradost
import android.annotation.SuppressLint
import android.util.Log
import com.google.gson.Gson
import com.lagradost.cloudstream3.*
import com.lagradost.cloudstream3.LoadResponse.Companion.addActors
import com.lagradost.cloudstream3.utils.AppUtils.tryParseJson
import com.lagradost.cloudstream3.utils.ExtractorLink
import com.lagradost.cloudstream3.utils.M3u8Helper
import com.lagradost.models.GeneralInfo
@ -36,7 +33,7 @@ class UASerialProvider : MainAPI() {
page: Int,
request: MainPageRequest
): HomePageResponse {
var document = app.get(request.data.format(page)).document
val document = app.get(request.data.format(page)).document
val home = document.select(".row .col").map {
it.toSearchResponse()
@ -57,7 +54,7 @@ class UASerialProvider : MainAPI() {
override suspend fun search(query: String): List<SearchResponse> {
val document = app.post(
url = "$mainUrl",
url = mainUrl,
data = mapOf(
"do" to "search",
"subaction" to "search",
@ -77,9 +74,9 @@ class UASerialProvider : MainAPI() {
val titleJson = Gson().fromJson(document.select("script[type*=json]").html(), GeneralInfo::class.java)
if(titleJson.type == "Movie"){
val titleJson = Gson().fromJson(document.select("script[type*=json]").html(), GeneralInfoMovie::class.java)
val titleJsonMovie = Gson().fromJson(document.select("script[type*=json]").html(), GeneralInfoMovie::class.java)
// Parse info for Serials
val title = titleJson.name
val title = titleJsonMovie.name
val poster = mainUrl + document.selectFirst("img.cover")?.attr("src")
val tags = document.select("div.genre div a").map { it.text() }
val year = document.select("div.release div a").text().toIntOrNull()
@ -87,7 +84,7 @@ class UASerialProvider : MainAPI() {
val tvType = TvType.Movie
val description = document.selectFirst(".text")?.text()?.trim()
val rating = document.select("div.rating__item--imdb div.number").text().toRatingInt()
val actors = titleJson.actor.map { it.name }
val actors = titleJsonMovie.actor.map { it.name }
return newMovieLoadResponse(title, url, tvType, url) {
this.posterUrl = poster
@ -110,13 +107,13 @@ class UASerialProvider : MainAPI() {
val actors = titleJson.partOfTVSeries.actor.map { it.name }
var episodes: List<Episode> = emptyList()
val episodes = mutableListOf<Episode>()
titleJson.partOfTVSeries.containsSeason.map { season ->
val documentSeason = app.get(season.url).document
season.episode.map { episode ->
var episodeName = documentSeason.select("div[data-episode-id=${episode.episodeNumber}] div.name").text().replaceFirstChar { it.uppercase() }
if (episodeName.isBlank()) { episodeName = episode.name.replaceFirstChar { it.uppercase() } }
episodes = episodes.plus(
episodes.add(
Episode(
"${season.url}, ${episode.episodeNumber}",
episodeName,

View file

@ -1,5 +1,5 @@
// use an integer for version numbers
version = 1
version = 2
cloudstream {

View file

@ -83,7 +83,7 @@ class UFDubProvider : MainAPI() {
// Parse info
val title = document.select("h1.top-title").text()
val poster = mainUrl + document.select("div.f-poster img").attr("src")
var tags = emptyList<String>()
val tags = mutableListOf<String>()
val year = someInfo.select("strong:contains(Рік випуску аніме:)").next().html().toIntOrNull()
// TODO: Check type by url
@ -101,7 +101,7 @@ class UFDubProvider : MainAPI() {
ele ->
when (ele.select("span").text()) {
//"Студія:" -> tags = ele.select("a").text().split(" / ")
"Жанр:" -> ele.select("a").map { tags = tags.plus(it.text()) }
"Жанр:" -> ele.select("a").map { tags.add(it.text()) }
}
}