AquaStream/app/src/main/java/com/lagradost/cloudstream3/MainAPI.kt

277 lines
7.5 KiB
Kotlin
Raw Normal View History

2021-04-30 17:20:15 +00:00
package com.lagradost.cloudstream3
2021-05-15 23:37:42 +00:00
import android.app.Activity
import androidx.preference.PreferenceManager
2021-04-30 17:20:15 +00:00
import com.fasterxml.jackson.databind.DeserializationFeature
import com.fasterxml.jackson.databind.json.JsonMapper
import com.fasterxml.jackson.module.kotlin.KotlinModule
2021-06-23 18:33:47 +00:00
import com.lagradost.cloudstream3.animeproviders.DubbedAnimeProvider
2021-05-12 21:51:02 +00:00
import com.lagradost.cloudstream3.animeproviders.ShiroProvider
2021-06-24 17:45:59 +00:00
import com.lagradost.cloudstream3.movieproviders.HDMProvider
import com.lagradost.cloudstream3.movieproviders.LookMovieProvider
import com.lagradost.cloudstream3.movieproviders.MeloMovieProvider
2021-06-26 14:44:53 +00:00
import com.lagradost.cloudstream3.movieproviders.TrailersToProvider
2021-05-20 15:22:28 +00:00
import com.lagradost.cloudstream3.utils.ExtractorLink
2021-04-30 17:20:15 +00:00
import java.util.*
import kotlin.collections.ArrayList
const val USER_AGENT = "Mozilla/5.0 (Windows NT 10.0; rv:68.0) Gecko/20100101 Firefox/68.0"
val baseHeader = mapOf("User-Agent" to USER_AGENT)
val mapper = JsonMapper.builder().addModule(KotlinModule())
.configure(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES, false).build()!!
2021-05-12 21:51:02 +00:00
object APIHolder {
2021-06-17 16:20:05 +00:00
val unixTime: Long
get() = System.currentTimeMillis() / 1000L
2021-05-15 23:37:42 +00:00
val allApi = AllProvider()
private const val defProvider = 0
val apis = arrayListOf(
ShiroProvider(),
MeloMovieProvider(),
2021-06-23 18:33:47 +00:00
DubbedAnimeProvider(),
2021-06-24 17:45:59 +00:00
HDMProvider(),
LookMovieProvider(),
2021-06-26 14:44:53 +00:00
TrailersToProvider(),
2021-05-12 21:51:02 +00:00
)
2021-05-15 23:37:42 +00:00
2021-05-22 22:25:56 +00:00
fun getApiFromName(apiName: String?): MainAPI {
2021-05-18 13:43:32 +00:00
for (api in apis) {
if (apiName == api.name)
return api
}
return apis[defProvider]
}
2021-05-15 23:37:42 +00:00
fun Activity.getApiSettings(): HashSet<String> {
val settingsManager = PreferenceManager.getDefaultSharedPreferences(this)
return settingsManager.getStringSet(this.getString(R.string.search_providers_list_key),
setOf(apis[defProvider].name))?.toHashSet() ?: hashSetOf(apis[defProvider].name)
}
2021-05-12 21:51:02 +00:00
}
abstract class MainAPI {
2021-04-30 17:20:15 +00:00
open val name = "NONE"
open val mainUrl = "NONE"
open val instantLinkLoading = false // THIS IS IF THE LINK IS STORED IN THE "DATA"
2021-06-17 16:20:05 +00:00
open val hasQuickSearch = false
2021-06-24 00:29:20 +00:00
open fun search(query: String): ArrayList<SearchResponse>? { // SearchResponse
2021-04-30 17:20:15 +00:00
return null
}
2021-06-26 14:44:53 +00:00
open fun quickSearch(query: String): ArrayList<SearchResponse>? {
2021-06-17 16:20:05 +00:00
return null
}
2021-06-24 00:29:20 +00:00
open fun load(slug: String): LoadResponse? {
2021-04-30 17:20:15 +00:00
return null
}
2021-05-20 15:22:28 +00:00
// callback is fired once a link is found, will return true if method is executed successfully
2021-06-14 16:58:43 +00:00
open fun loadLinks(data: String, isCasting: Boolean, callback: (ExtractorLink) -> Unit): Boolean {
2021-04-30 17:20:15 +00:00
return false
}
}
2021-06-26 14:44:53 +00:00
fun parseRating(ratingString: String?): Int? {
if (ratingString == null) return null
2021-06-24 17:45:59 +00:00
val floatRating = ratingString.toFloatOrNull() ?: return null
return (floatRating * 10).toInt()
}
2021-05-15 23:37:42 +00:00
fun MainAPI.fixUrl(url: String): String {
2021-06-26 14:44:53 +00:00
if (url.startsWith("http")) {
2021-06-23 18:33:47 +00:00
return url
}
val startsWithNoHttp = url.startsWith("//")
2021-06-26 14:44:53 +00:00
if (startsWithNoHttp) {
2021-06-23 18:33:47 +00:00
return "https:$url"
2021-06-26 14:44:53 +00:00
} else {
if (url.startsWith('/')) {
2021-06-23 18:33:47 +00:00
return mainUrl + url
}
2021-05-15 23:37:42 +00:00
return "$mainUrl/$url"
}
}
2021-06-10 19:43:05 +00:00
fun sortUrls(urls: List<ExtractorLink>): List<ExtractorLink> {
return urls.sortedBy { t -> -t.quality }
}
2021-05-15 23:37:42 +00:00
2021-04-30 17:20:15 +00:00
enum class ShowStatus {
Completed,
Ongoing,
}
enum class DubStatus {
2021-05-22 22:25:56 +00:00
Dubbed,
Subbed,
2021-04-30 17:20:15 +00:00
}
enum class TvType {
Movie,
TvSeries,
Anime,
ONA,
}
interface SearchResponse {
val name: String
2021-05-18 13:43:32 +00:00
val url: String // PUBLIC URL FOR OPEN IN APP
val slug: String // USED FOR INTERNAL DATA
2021-04-30 17:20:15 +00:00
val apiName: String
val type: TvType
val posterUrl: String?
val year: Int?
}
data class AnimeSearchResponse(
override val name: String,
override val url: String,
2021-05-18 13:43:32 +00:00
override val slug: String,
2021-04-30 17:20:15 +00:00
override val apiName: String,
override val type: TvType,
override val posterUrl: String?,
override val year: Int?,
val otherName: String?,
val dubStatus: EnumSet<DubStatus>?,
val dubEpisodes: Int?,
val subEpisodes: Int?,
) : SearchResponse
data class MovieSearchResponse(
override val name: String,
override val url: String,
2021-05-18 13:43:32 +00:00
override val slug: String,
2021-04-30 17:20:15 +00:00
override val apiName: String,
override val type: TvType,
override val posterUrl: String?,
override val year: Int?,
) : SearchResponse
data class TvSeriesSearchResponse(
override val name: String,
override val url: String,
2021-05-18 13:43:32 +00:00
override val slug: String,
2021-04-30 17:20:15 +00:00
override val apiName: String,
override val type: TvType,
override val posterUrl: String?,
override val year: Int?,
val episodes: Int?,
) : SearchResponse
interface LoadResponse {
val name: String
val url: String
val apiName: String
val type: TvType
val posterUrl: String?
val year: Int?
2021-05-22 22:25:56 +00:00
val plot: String?
2021-06-26 14:44:53 +00:00
val rating: Int? // 0-100
val tags: ArrayList<String>?
val duration: String?
val trailerUrl: String?
2021-04-30 17:20:15 +00:00
}
2021-06-17 15:39:01 +00:00
fun LoadResponse?.isEpisodeBased(): Boolean {
if (this == null) return false
return (this is AnimeLoadResponse || this is TvSeriesLoadResponse) && (this.type == TvType.TvSeries || this.type == TvType.Anime)
}
fun LoadResponse?.isAnimeBased(): Boolean {
if (this == null) return false
return (this.type == TvType.Anime || this.type == TvType.ONA) // && (this is AnimeLoadResponse)
2021-05-28 13:38:06 +00:00
}
2021-06-26 19:32:50 +00:00
data class AnimeEpisode(
val url: String,
val name: String? = null,
val posterUrl: String? = null,
val date: String? = null,
val rating: Int? = null,
val descript: String? = null,
)
2021-06-23 18:33:47 +00:00
2021-04-30 17:20:15 +00:00
data class AnimeLoadResponse(
2021-05-16 18:28:00 +00:00
val engName: String?,
val japName: String?,
2021-04-30 17:20:15 +00:00
override val name: String,
override val url: String,
override val apiName: String,
override val type: TvType,
override val posterUrl: String?,
override val year: Int?,
2021-06-23 18:33:47 +00:00
val dubEpisodes: ArrayList<AnimeEpisode>?,
val subEpisodes: ArrayList<AnimeEpisode>?,
2021-04-30 17:20:15 +00:00
val showStatus: ShowStatus?,
2021-05-22 22:25:56 +00:00
override val plot: String?,
2021-06-26 14:44:53 +00:00
override val tags: ArrayList<String>? = null,
2021-06-23 18:33:47 +00:00
val synonyms: ArrayList<String>? = null,
2021-04-30 17:20:15 +00:00
2021-06-23 18:33:47 +00:00
val malId: Int? = null,
val anilistId: Int? = null,
2021-06-24 17:45:59 +00:00
override val rating: Int? = null,
2021-06-26 14:44:53 +00:00
override val duration: String? = null,
override val trailerUrl: String? = null,
2021-04-30 17:20:15 +00:00
) : LoadResponse
data class MovieLoadResponse(
override val name: String,
override val url: String,
override val apiName: String,
override val type: TvType,
2021-06-23 18:33:47 +00:00
val dataUrl: String,
2021-04-30 17:20:15 +00:00
override val posterUrl: String?,
override val year: Int?,
2021-05-22 22:25:56 +00:00
override val plot: String?,
2021-04-30 17:20:15 +00:00
2021-06-26 14:44:53 +00:00
val imdbUrl: String?,
2021-06-24 17:45:59 +00:00
override val rating: Int? = null,
2021-06-26 14:44:53 +00:00
override val tags: ArrayList<String>? = null,
override val duration: String? = null,
override val trailerUrl: String? = null,
2021-04-30 17:20:15 +00:00
) : LoadResponse
2021-06-26 14:44:53 +00:00
data class TvSeriesEpisode(
val name: String?,
val season: Int?,
val episode: Int?,
val data: String,
val posterUrl: String? = null,
val date: String? = null,
val rating: Int? = null,
val descript: String? = null,
)
2021-04-30 17:20:15 +00:00
data class TvSeriesLoadResponse(
override val name: String,
override val url: String,
override val apiName: String,
override val type: TvType,
val episodes: ArrayList<TvSeriesEpisode>,
2021-04-30 17:20:15 +00:00
override val posterUrl: String?,
override val year: Int?,
2021-05-22 22:25:56 +00:00
override val plot: String?,
2021-04-30 17:20:15 +00:00
val showStatus: ShowStatus?,
2021-06-26 14:44:53 +00:00
val imdbUrl: String?,
2021-06-24 17:45:59 +00:00
override val rating: Int? = null,
2021-06-26 14:44:53 +00:00
override val tags: ArrayList<String>? = null,
override val duration: String? = null,
override val trailerUrl: String? = null,
2021-04-30 17:20:15 +00:00
) : LoadResponse