diff --git a/src/es/pelisplushd/build.gradle b/src/es/pelisplushd/build.gradle index 44146ff0a..a093b1ef8 100644 --- a/src/es/pelisplushd/build.gradle +++ b/src/es/pelisplushd/build.gradle @@ -5,7 +5,7 @@ ext { extName = 'Pelisplushd' pkgNameSuffix = 'es.pelisplushd' extClass = '.PelisplushdFactory' - extVersionCode = 35 + extVersionCode = 36 libVersion = '13' } @@ -16,6 +16,7 @@ dependencies { implementation(project(':lib-streamsb-extractor')) implementation(project(':lib-dood-extractor')) implementation(project(':lib-voe-extractor')) + implementation(project(':lib-okru-extractor')) } apply from: "$rootDir/common.gradle" diff --git a/src/es/pelisplushd/src/eu/kanade/tachiyomi/animeextension/es/pelisplushd/Pelisplushd.kt b/src/es/pelisplushd/src/eu/kanade/tachiyomi/animeextension/es/pelisplushd/Pelisplushd.kt index e6187d4cd..da2996a88 100644 --- a/src/es/pelisplushd/src/eu/kanade/tachiyomi/animeextension/es/pelisplushd/Pelisplushd.kt +++ b/src/es/pelisplushd/src/eu/kanade/tachiyomi/animeextension/es/pelisplushd/Pelisplushd.kt @@ -226,7 +226,7 @@ open class Pelisplushd(override val name: String, override val baseUrl: String) } } - private fun getNumberFromString(epsStr: String): String { + fun getNumberFromString(epsStr: String): String { return epsStr.filter { it.isDigit() }.ifEmpty { "0" } } diff --git a/src/es/pelisplushd/src/eu/kanade/tachiyomi/animeextension/es/pelisplushd/PelisplushdFactory.kt b/src/es/pelisplushd/src/eu/kanade/tachiyomi/animeextension/es/pelisplushd/PelisplushdFactory.kt index 454161219..73947550a 100644 --- a/src/es/pelisplushd/src/eu/kanade/tachiyomi/animeextension/es/pelisplushd/PelisplushdFactory.kt +++ b/src/es/pelisplushd/src/eu/kanade/tachiyomi/animeextension/es/pelisplushd/PelisplushdFactory.kt @@ -7,5 +7,6 @@ class PelisplushdFactory : AnimeSourceFactory { override fun createSources(): List = listOf( Pelisplushd("PelisPlusHD", "https://ww1.pelisplushd.nu"), Pelisplusto("PelisPlusTo", "https://ww3.pelisplus.to"), + Pelisplusph("PelisPlusPh", "https://www.pelisplushd.ph"), ) } diff --git a/src/es/pelisplushd/src/eu/kanade/tachiyomi/animeextension/es/pelisplushd/Pelisplusph.kt b/src/es/pelisplushd/src/eu/kanade/tachiyomi/animeextension/es/pelisplushd/Pelisplusph.kt new file mode 100644 index 000000000..d6f0735cb --- /dev/null +++ b/src/es/pelisplushd/src/eu/kanade/tachiyomi/animeextension/es/pelisplushd/Pelisplusph.kt @@ -0,0 +1,337 @@ +package eu.kanade.tachiyomi.animeextension.es.pelisplushd + +import androidx.preference.ListPreference +import androidx.preference.PreferenceScreen +import eu.kanade.tachiyomi.animeextension.es.pelisplushd.extractors.FilemoonExtractor +import eu.kanade.tachiyomi.animeextension.es.pelisplushd.extractors.StreamlareExtractor +import eu.kanade.tachiyomi.animesource.model.AnimeFilter +import eu.kanade.tachiyomi.animesource.model.AnimeFilterList +import eu.kanade.tachiyomi.animesource.model.SAnime +import eu.kanade.tachiyomi.animesource.model.SEpisode +import eu.kanade.tachiyomi.animesource.model.Video +import eu.kanade.tachiyomi.lib.doodextractor.DoodExtractor +import eu.kanade.tachiyomi.lib.okruextractor.OkruExtractor +import eu.kanade.tachiyomi.lib.streamsbextractor.StreamSBExtractor +import eu.kanade.tachiyomi.lib.voeextractor.VoeExtractor +import eu.kanade.tachiyomi.lib.youruploadextractor.YourUploadExtractor +import eu.kanade.tachiyomi.network.GET +import eu.kanade.tachiyomi.util.asJsoup +import kotlinx.serialization.decodeFromString +import kotlinx.serialization.json.Json +import kotlinx.serialization.json.JsonObject +import kotlinx.serialization.json.jsonPrimitive +import okhttp3.Request +import okhttp3.Response +import org.jsoup.nodes.Document +import org.jsoup.nodes.Element +import uy.kohesive.injekt.injectLazy + +class Pelisplusph(override val name: String, override val baseUrl: String) : Pelisplushd(name, baseUrl) { + + private val json: Json by injectLazy() + + override val supportsLatest = false + + override fun popularAnimeSelector(): String = ".items-peliculas .item-pelicula" + + override fun popularAnimeNextPageSelector(): String = ".items-peliculas > a" + + override fun popularAnimeRequest(page: Int): Request = GET("$baseUrl/peliculas?page=$page") + + override fun popularAnimeFromElement(element: Element): SAnime { + val anime = SAnime.create() + anime.setUrlWithoutDomain(baseUrl + element.selectFirst("a")?.attr("href")) + anime.title = element.select("a .item-detail > p").text() + anime.thumbnail_url = baseUrl + element.select("a .item-picture img").attr("src") + return anime + } + + override fun animeDetailsParse(document: Document): SAnime { + val anime = SAnime.create() + anime.title = document.selectFirst(".info-content h1")!!.text() + document.select(".info-content p").map { p -> + if (p.select(".content-type").text().contains("Sinópsis:")) { + anime.description = p.select(".sinopsis")!!.text() + } + if (p.select(".content-type").text().contains("Géneros:")) { + anime.genre = p.select(".content-type-a a").joinToString { it.text() } + } + if (p.select(".content-type").text().contains("Reparto:")) { + anime.artist = p.select(".content-type ~ span").text().substringBefore(",") + } + } + anime.status = if (document.location().contains("/serie/")) SAnime.UNKNOWN else SAnime.COMPLETED + + return anime + } + + override fun episodeListParse(response: Response): List { + val episodes = mutableListOf() + val jsoup = response.asJsoup() + if (response.request.url.toString().contains("/pelicula/")) { + val episode = SEpisode.create().apply { + episode_number = 1F + name = "PELÍCULA" + } + episode.setUrlWithoutDomain(response.request.url.toString()) + episodes.add(episode) + } else { + var index = 0 + jsoup.select(".item-season").reversed().mapIndexed { idxSeas, season -> + val seasonNumber = try { + getNumberFromString(season.selectFirst(".item-season-title")!!.ownText()) + } catch (_: Exception) { idxSeas + 1 } + season.select(".item-season-episodes a").reversed().mapIndexed { idx, ep -> + index += 1 + val noEp = try { + getNumberFromString(ep.ownText()) + } catch (_: Exception) { idx + 1 } + + val episode = SEpisode.create() + episode.episode_number = index.toFloat() + episode.name = "T$seasonNumber - E$noEp - ${ep.ownText()}" + episode.setUrlWithoutDomain(baseUrl + ep.attr("href")) + episodes.add(episode) + } + } + } + return episodes.reversed() + } + + override fun searchAnimeRequest(page: Int, query: String, filters: AnimeFilterList): Request { + val filterList = if (filters.isEmpty()) getFilterList() else filters + val genreFilter = filterList.find { it is GenreFilter } as GenreFilter + return when { + query.isNotBlank() -> GET("$baseUrl/search/$query", headers) + genreFilter.state != 0 -> GET("$baseUrl/${genreFilter.toUriPart()}?page=$page") + else -> popularAnimeRequest(page) + } + } + + override fun videoListParse(response: Response): List