unimay: Update models and add new MainPage
All checks were successful
Build / build (push) Successful in 1m23s
All checks were successful
Build / build (push) Successful in 1m23s
This commit is contained in:
parent
b0c94febf5
commit
752f95fe38
5 changed files with 183 additions and 66 deletions
|
@ -1,5 +1,9 @@
|
|||
// use an integer for version numbers
|
||||
version = 6
|
||||
version = 7
|
||||
|
||||
dependencies{
|
||||
implementation("com.google.code.gson:gson:2.9.0")
|
||||
}
|
||||
|
||||
cloudstream {
|
||||
language = "uk"
|
||||
|
|
|
@ -1,5 +1,8 @@
|
|||
package com.lagradost
|
||||
|
||||
import android.util.Log
|
||||
import com.google.gson.Gson
|
||||
import com.google.gson.reflect.TypeToken
|
||||
import com.lagradost.cloudstream3.DubStatus
|
||||
import com.lagradost.cloudstream3.Episode
|
||||
import com.lagradost.cloudstream3.HomePageResponse
|
||||
|
@ -21,8 +24,8 @@ import com.lagradost.cloudstream3.newHomePageResponse
|
|||
import com.lagradost.cloudstream3.utils.ExtractorLink
|
||||
import com.lagradost.cloudstream3.utils.M3u8Helper
|
||||
import com.lagradost.models.Releases
|
||||
import com.lagradost.models.SearchGet
|
||||
import com.lagradost.models.SearchModel
|
||||
import com.lagradost.models.Updates
|
||||
|
||||
class UnimayProvider : MainAPI() {
|
||||
|
||||
|
@ -39,13 +42,15 @@ class UnimayProvider : MainAPI() {
|
|||
|
||||
private val apiUrl = "https://api.unimay.media"
|
||||
private val findUrl = "$apiUrl/v1/release/search?title="
|
||||
private val imagesUrl = "$apiUrl/storage/images/"
|
||||
private val imagesUrl = "https://img.unimay.media/"
|
||||
|
||||
private val TAG = name
|
||||
private val listUpdatesModel = object : TypeToken<List<Updates>>() { }.type
|
||||
|
||||
// Sections
|
||||
override val mainPage = mainPageOf(
|
||||
"$apiUrl/api/release/all?page=" to "Останні релізи",
|
||||
"$apiUrl/v1/list/series/updates?size=15" to "Останні релізи",
|
||||
"$apiUrl/v1/release/search?page_size=10&page=" to "Наши проєкти",
|
||||
)
|
||||
|
||||
// Done
|
||||
|
@ -53,19 +58,29 @@ class UnimayProvider : MainAPI() {
|
|||
page: Int,
|
||||
request: MainPageRequest
|
||||
): HomePageResponse {
|
||||
val homeList = app.get("${request.data}$page").parsedSafe<Releases>()!!.releases.map{
|
||||
newAnimeSearchResponse(it.name, "$apiUrl/api/release/${it.code}", TvType.Anime) {
|
||||
this.posterUrl = "$imagesUrl${it.imageId}"
|
||||
addDubStatus("${it.playlistSize}/${it.episodes}", it.playlistSize)
|
||||
if (page != 1 && request.data.contains("updates")) return HomePageResponse(emptyList())
|
||||
if (request.data.contains("updates")){
|
||||
val homeList = Gson().fromJson<List<Updates>>(app.get("${request.data}").text, listUpdatesModel).map{
|
||||
newAnimeSearchResponse(it.release.name, "$apiUrl/v1/release?code=${it.release.code}", TvType.Anime) {
|
||||
this.posterUrl = "$imagesUrl${it.release.posterUuid}"
|
||||
addDubStatus(DubStatus.Dubbed, it.series.number)
|
||||
}
|
||||
}
|
||||
return newHomePageResponse(request.name, homeList)
|
||||
}
|
||||
|
||||
val homeList = Gson().fromJson(app.get("${request.data}${page}").text, SearchModel::class.java).content.map{
|
||||
newAnimeSearchResponse(it.names.ukr, "$apiUrl/v1/release?code=${it.code}", TvType.Anime) {
|
||||
this.posterUrl = "$imagesUrl${it.images.poster}"
|
||||
addDubStatus(DubStatus.Dubbed, it.playlistSize)
|
||||
}
|
||||
}
|
||||
return newHomePageResponse(request.name, homeList)
|
||||
}
|
||||
|
||||
override suspend fun search(query: String): List<SearchResponse> {
|
||||
return app.get("$findUrl$query&page=0").parsedSafe<SearchGet>()!!.content.map{
|
||||
newAnimeSearchResponse(it.names.ukr, "$apiUrl/api/release/${it.code}", TvType.Anime) {
|
||||
return Gson().fromJson(app.get("$findUrl$query&page=0").text, SearchModel::class.java).content.map{
|
||||
newAnimeSearchResponse(it.names.ukr, "$apiUrl/v1/release?code=${it.code}", TvType.Anime) {
|
||||
this.posterUrl = "$imagesUrl${it.images.poster}"
|
||||
addDubStatus("${it.playlistSize}/${it.playlistSize}", it.playlistSize)
|
||||
}
|
||||
|
@ -75,7 +90,7 @@ class UnimayProvider : MainAPI() {
|
|||
// Detailed information
|
||||
override suspend fun load(url: String): LoadResponse {
|
||||
// Log.d("CakesTwix-Debug", url)
|
||||
val anime = app.get(url).parsedSafe<SearchModel>()!!
|
||||
val anime = Gson().fromJson(app.get(url).text, Releases::class.java)
|
||||
// val anime = Gson().fromJson(app.get("$apiUrl/api/release/${url.substringAfterLast("/")}").text, SearchModel::class.java)
|
||||
|
||||
val showStatus = when(anime.statusCode){
|
||||
|
@ -96,17 +111,17 @@ class UnimayProvider : MainAPI() {
|
|||
"${anime.code}, ${it.number}",
|
||||
it.title,
|
||||
episode = it.number,
|
||||
posterUrl = if(it.previewId != null) { "$imagesUrl${it.previewId}" } else null,
|
||||
posterUrl = if(it.imageUuid != null) { "$imagesUrl${it.imageUuid}" } else null,
|
||||
)
|
||||
}
|
||||
|
||||
return newAnimeLoadResponse(
|
||||
anime.name,
|
||||
anime.names.ukr,
|
||||
"$mainUrl/projects/${anime.code}",
|
||||
tvType,
|
||||
) {
|
||||
this.engName = anime.engName
|
||||
this.posterUrl = "$imagesUrl${anime.posterId}"
|
||||
this.engName = anime.names.eng
|
||||
this.posterUrl = "$imagesUrl${anime.images.banner}"
|
||||
this.tags = anime.genres
|
||||
this.plot = anime.description
|
||||
this.showStatus = showStatus
|
||||
|
@ -126,16 +141,13 @@ class UnimayProvider : MainAPI() {
|
|||
): Boolean {
|
||||
// anime_id, episode number
|
||||
val dataList = data.split(", ")
|
||||
// Log.d("CakesTwix-Debug", dataList.toString())
|
||||
|
||||
val anime = app.get("$apiUrl/api/release/${dataList[0]}").parsedSafe<SearchModel>()!!
|
||||
// val anime = Gson().fromJson(app.get("$apiUrl/api/release/${dataList[0]}").text, SearchModel::class.java)
|
||||
val anime = Gson().fromJson(app.get("$apiUrl/v1/release?code=${dataList[0]}").text, Releases::class.java)
|
||||
val episode = anime.playlist.first { it.number == dataList[1].toInt() }
|
||||
|
||||
if (episode.playlist != null) {
|
||||
if (episode.hls != null) {
|
||||
M3u8Helper.generateM3u8(
|
||||
source = "Unimay",
|
||||
streamUrl = episode.playlist,
|
||||
streamUrl = episode.hls.master,
|
||||
referer = "https://www.unimay.media"
|
||||
).forEach(callback)
|
||||
return true
|
||||
|
|
|
@ -2,22 +2,95 @@ package com.lagradost.models
|
|||
|
||||
data class Releases(
|
||||
|
||||
val titleCount : Int,
|
||||
val releases : List<Release>
|
||||
)
|
||||
|
||||
data class Release (
|
||||
|
||||
val id : Int,
|
||||
val imageId : Int,
|
||||
val aniListId : Int,
|
||||
// val lastUpdate : Int,
|
||||
// val lastEdit : Int,
|
||||
val statusCode : Int,
|
||||
val episodes : Int,
|
||||
val playlistSize : Int,
|
||||
val episodeLength : Int,
|
||||
val year : Int,
|
||||
val playlistSize : Int,
|
||||
val commentsCount : Int,
|
||||
val restricted : Boolean,
|
||||
val adult : Boolean,
|
||||
val partOfFranchise : Boolean,
|
||||
val announcement : String,
|
||||
val collaboration : String,
|
||||
val code : String,
|
||||
val description : String,
|
||||
val name : String,
|
||||
val imdbId : String,
|
||||
val tgCode : String,
|
||||
val trailer : String,
|
||||
val type : String,
|
||||
val season : String,
|
||||
val statusCode : Int
|
||||
val description : String,
|
||||
val names : Names,
|
||||
val images : Images,
|
||||
val genres : List<String>,
|
||||
val playlist : List<Playlist>,
|
||||
val actors : List<Actors>,
|
||||
val translators : List<Translators>,
|
||||
val soundmen : List<Soundmen>
|
||||
)
|
||||
|
||||
data class Actors (
|
||||
|
||||
val id : Int,
|
||||
val imageUuid : String,
|
||||
val nickName : String
|
||||
)
|
||||
|
||||
data class Hls (
|
||||
|
||||
val qualities : Qualities,
|
||||
val master : String
|
||||
)
|
||||
|
||||
data class Images (
|
||||
|
||||
val banner : String,
|
||||
val logo : String,
|
||||
val poster : String
|
||||
)
|
||||
|
||||
data class Names (
|
||||
|
||||
val romaji : String,
|
||||
val ukr : String,
|
||||
val eng : String
|
||||
)
|
||||
|
||||
data class Playlist (
|
||||
|
||||
val id : Int,
|
||||
val imageUuid : String,
|
||||
val number : Int,
|
||||
val duration : Int,
|
||||
val premium : Boolean,
|
||||
val thumbnails : Boolean,
|
||||
val uuid : String,
|
||||
val title : String,
|
||||
// val creationTimestamp : Int,
|
||||
val hls : Hls
|
||||
)
|
||||
|
||||
data class Qualities (
|
||||
|
||||
val fhd : String,
|
||||
val hd : String,
|
||||
val qhd : String
|
||||
)
|
||||
|
||||
data class Soundmen (
|
||||
|
||||
val id : Int,
|
||||
val imageUuid : String,
|
||||
val nickName : String
|
||||
)
|
||||
|
||||
data class Translators (
|
||||
|
||||
val id : Int,
|
||||
val imageUuid : String,
|
||||
val nickName : String
|
||||
)
|
|
@ -2,53 +2,52 @@ package com.lagradost.models
|
|||
|
||||
data class SearchModel (
|
||||
|
||||
val code : String,
|
||||
val year : Int,
|
||||
val description : String,
|
||||
val type : String,
|
||||
val engName : String,
|
||||
// val translators : List<Translators>,
|
||||
val playlist : List<Playlist>,
|
||||
val genres : List<String>,
|
||||
val aniListId : Int,
|
||||
val imageId : Int,
|
||||
val name : String,
|
||||
val posterId : Int,
|
||||
val statusCode : Int,
|
||||
val episodeLength : Int,
|
||||
)
|
||||
|
||||
data class Playlist (
|
||||
|
||||
val preview : Int,
|
||||
val title : String,
|
||||
val number : Int,
|
||||
val previewId : Int,
|
||||
val playlist : String,
|
||||
)
|
||||
|
||||
data class SearchGet (
|
||||
val content : List<Content>,
|
||||
val pageable : Pageable,
|
||||
val totalElements : Int,
|
||||
val last : Boolean,
|
||||
val totalPages : Int,
|
||||
val size : Int,
|
||||
val number : Int,
|
||||
val sort : Sort,
|
||||
val numberOfElements : Int,
|
||||
val first : Boolean,
|
||||
val empty : Boolean
|
||||
)
|
||||
|
||||
data class Content (
|
||||
|
||||
val id : Int,
|
||||
val aniListId : Int,
|
||||
// val lastUpdate : Int,
|
||||
val episodes : Int,
|
||||
val playlistSize : Int,
|
||||
val statusCode : Int,
|
||||
val year : Int,
|
||||
val adult : Boolean,
|
||||
val restricted : Boolean,
|
||||
val code : String,
|
||||
val type : String,
|
||||
val season : String,
|
||||
val description : String,
|
||||
val names : Names,
|
||||
val images : Images,
|
||||
val genres : List<String>
|
||||
)
|
||||
|
||||
data class Images (
|
||||
data class Pageable (
|
||||
|
||||
val banner : Int?,
|
||||
val poster : Int
|
||||
val sort : Sort,
|
||||
val pageNumber : Int,
|
||||
val pageSize : Int,
|
||||
val offset : Int,
|
||||
val paged : Boolean,
|
||||
val unpaged : Boolean
|
||||
)
|
||||
|
||||
data class Names (
|
||||
data class Sort (
|
||||
|
||||
val romaji : String,
|
||||
val ukr : String,
|
||||
val eng : String
|
||||
val sorted : Boolean,
|
||||
val empty : Boolean,
|
||||
val unsorted : Boolean
|
||||
)
|
|
@ -0,0 +1,29 @@
|
|||
package com.lagradost.models
|
||||
|
||||
data class Updates (
|
||||
|
||||
val series : Series,
|
||||
val release : Release
|
||||
)
|
||||
|
||||
data class Release (
|
||||
|
||||
val id : Int,
|
||||
// vval lastUpdate : Int,
|
||||
val posterUuid : String,
|
||||
val code : String,
|
||||
val name : String,
|
||||
val type : String
|
||||
)
|
||||
|
||||
data class Series (
|
||||
|
||||
val id : Int,
|
||||
val imageUuid : String,
|
||||
val number : Int,
|
||||
val premium : Boolean,
|
||||
val duration : Int,
|
||||
val title : String,
|
||||
// val creationTimestamp : Int,
|
||||
val releaseId : Int
|
||||
)
|
Loading…
Reference in a new issue