diff --git a/src/es/pelisflix/AndroidManifest.xml b/src/es/pelisflix/AndroidManifest.xml new file mode 100644 index 000000000..acb4de356 --- /dev/null +++ b/src/es/pelisflix/AndroidManifest.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/src/es/pelisflix/build.gradle b/src/es/pelisflix/build.gradle new file mode 100644 index 000000000..6ea3d17eb --- /dev/null +++ b/src/es/pelisflix/build.gradle @@ -0,0 +1,12 @@ +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' + +ext { + extName = 'Pelisflix' + pkgNameSuffix = 'es.pelisflix' + extClass = '.PelisflixFactory' + extVersionCode = 1 + libVersion = '13' +} + +apply from: "$rootDir/common.gradle" diff --git a/src/es/pelisflix/res/mipmap-hdpi/ic_launcher.png b/src/es/pelisflix/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..730e76561 Binary files /dev/null and b/src/es/pelisflix/res/mipmap-hdpi/ic_launcher.png differ diff --git a/src/es/pelisflix/res/mipmap-mdpi/ic_launcher.png b/src/es/pelisflix/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..9ec7dbb53 Binary files /dev/null and b/src/es/pelisflix/res/mipmap-mdpi/ic_launcher.png differ diff --git a/src/es/pelisflix/res/mipmap-xhdpi/ic_launcher.png b/src/es/pelisflix/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..0e9c48dc1 Binary files /dev/null and b/src/es/pelisflix/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/src/es/pelisflix/res/mipmap-xxhdpi/ic_launcher.png b/src/es/pelisflix/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..cf6db2adb Binary files /dev/null and b/src/es/pelisflix/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/src/es/pelisflix/res/mipmap-xxxhdpi/ic_launcher.png b/src/es/pelisflix/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..b30b86d6c Binary files /dev/null and b/src/es/pelisflix/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/src/es/pelisflix/src/eu/kanade/tachiyomi/animeextension/es/pelisflix/Pelisflix.kt b/src/es/pelisflix/src/eu/kanade/tachiyomi/animeextension/es/pelisflix/Pelisflix.kt new file mode 100644 index 000000000..aca6b7dc0 --- /dev/null +++ b/src/es/pelisflix/src/eu/kanade/tachiyomi/animeextension/es/pelisflix/Pelisflix.kt @@ -0,0 +1,285 @@ +package eu.kanade.tachiyomi.animeextension.es.pelisflix + +import android.app.Application +import android.content.SharedPreferences +import android.util.Base64 +import androidx.preference.ListPreference +import androidx.preference.PreferenceScreen +import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource +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.animesource.online.ParsedAnimeHttpSource +import eu.kanade.tachiyomi.network.GET +import eu.kanade.tachiyomi.util.asJsoup +import kotlinx.serialization.json.Json +import okhttp3.OkHttpClient +import okhttp3.Request +import okhttp3.Response +import org.jsoup.nodes.Document +import org.jsoup.nodes.Element +import org.jsoup.select.Elements +import uy.kohesive.injekt.Injekt +import uy.kohesive.injekt.api.get +import uy.kohesive.injekt.injectLazy +import java.io.IOException +import java.lang.Exception + +open class Pelisflix(override val name: String, override val baseUrl: String) : ConfigurableAnimeSource, ParsedAnimeHttpSource() { + + override val lang = "es" + + override val supportsLatest = false + + override val client: OkHttpClient = network.cloudflareClient + + private val json: Json by injectLazy() + + private val preferences: SharedPreferences by lazy { + Injekt.get().getSharedPreferences("source_$id", 0x0000) + } + + override fun popularAnimeRequest(page: Int): Request = GET("$baseUrl/peliculas-online/page/$page") + + override fun popularAnimeSelector(): String = "#Tf-Wp div.TpRwCont ul.MovieList li.TPostMv article.TPost" + + override fun popularAnimeFromElement(element: Element): SAnime { + val anime = SAnime.create() + anime.setUrlWithoutDomain(element.select("a").attr("href")) + anime.title = element.select("a h2.Title").text() + anime.thumbnail_url = externalOrInternalImg(element.selectFirst("a div.Image figure.Objf img.imglazy").attr("data-src")) + anime.description = element.select("div.TPMvCn div.Description p:nth-child(1)").text().removeSurrounding("\"") + return anime + } + + override fun popularAnimeNextPageSelector(): String = "nav.wp-pagenavi div.nav-links a ~ a" + + override fun episodeListParse(response: Response): List { + val document = response.asJsoup() + val episodeList = mutableListOf() + val movie = document.select("ul.optnslst li div[data-url]") + val seasons = document.select("main .SeasonBx a") + if (movie.any()) { + val movieEp = SEpisode.create() + movieEp.name = "Pelicula" + movieEp.episode_number = 1f + movieEp.setUrlWithoutDomain(response.request.url.toString()) + episodeList.add(movieEp) + } else if (seasons.any()) { + val seasonEp = extractEpisodesFromSeasons(seasons) + if (seasonEp.isNotEmpty()) episodeList.addAll(seasonEp) + } + return episodeList.reversed() + } + + private fun extractEpisodesFromSeasons(seasons: Elements): List { + val episodeList = mutableListOf() + var noEp = 1f + var noTemp = 1 + seasons!!.forEach { + var request = client.newCall(GET(it!!.attr("href"))).execute() + if (request.isSuccessful) { + val document = request.asJsoup() + document.select("div.TPTblCn table tbody tr.Viewed")!!.forEach { epContainer -> + val urlEp = epContainer.selectFirst("td.MvTbPly > a").attr("href") + val ep = SEpisode.create() + ep.name = "T$noTemp - Episodio $noEp" + ep.episode_number = noEp + ep.setUrlWithoutDomain(urlEp) + episodeList.add(ep) + noEp++ + } + } + noTemp++ + } + return episodeList + } + + override fun episodeListSelector() = "uwu" + + override fun episodeFromElement(element: Element) = throw Exception("not used") + + override fun videoListParse(response: Response): List