From 68db5b45b724e0cf288601ee7a60a412d84a4563 Mon Sep 17 00:00:00 2001 From: imper1aldev Date: Sun, 19 Mar 2023 12:25:42 -0600 Subject: [PATCH] Fixes (#1425) --- src/es/ennovelas/build.gradle | 10 +- .../animeextension/es/ennovelas/EnNovelas.kt | 308 ++++++++++++++---- .../extractors/StreamlareExtractor.kt | 55 ++++ 3 files changed, 311 insertions(+), 62 deletions(-) create mode 100644 src/es/ennovelas/src/eu/kanade/tachiyomi/animeextension/es/ennovelas/extractors/StreamlareExtractor.kt diff --git a/src/es/ennovelas/build.gradle b/src/es/ennovelas/build.gradle index bfad41cd8..9b47aa371 100644 --- a/src/es/ennovelas/build.gradle +++ b/src/es/ennovelas/build.gradle @@ -5,8 +5,16 @@ ext { extName = 'EnNovelas' pkgNameSuffix = 'es.ennovelas' extClass = '.EnNovelas' - extVersionCode = 1 + extVersionCode = 2 libVersion = '13' } +dependencies { + implementation(project(':lib-okru-extractor')) + implementation project(path: ':lib-streamsb-extractor') + implementation project(path: ':lib-fembed-extractor') + implementation project(path: ':lib-voe-extractor') + implementation project(path: ':lib-streamtape-extractor') + implementation project(path: ':lib-dood-extractor') +} apply from: "$rootDir/common.gradle" diff --git a/src/es/ennovelas/src/eu/kanade/tachiyomi/animeextension/es/ennovelas/EnNovelas.kt b/src/es/ennovelas/src/eu/kanade/tachiyomi/animeextension/es/ennovelas/EnNovelas.kt index 04e7e7c60..0e132d97e 100644 --- a/src/es/ennovelas/src/eu/kanade/tachiyomi/animeextension/es/ennovelas/EnNovelas.kt +++ b/src/es/ennovelas/src/eu/kanade/tachiyomi/animeextension/es/ennovelas/EnNovelas.kt @@ -4,29 +4,40 @@ import android.app.Application import android.content.SharedPreferences import androidx.preference.ListPreference import androidx.preference.PreferenceScreen +import eu.kanade.tachiyomi.animeextension.es.ennovelas.extractors.StreamlareExtractor import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource import eu.kanade.tachiyomi.animesource.model.AnimeFilterList +import eu.kanade.tachiyomi.animesource.model.AnimesPage 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.lib.doodextractor.DoodExtractor +import eu.kanade.tachiyomi.lib.fembedextractor.FembedExtractor +import eu.kanade.tachiyomi.lib.okruextractor.OkruExtractor +import eu.kanade.tachiyomi.lib.streamsbextractor.StreamSBExtractor +import eu.kanade.tachiyomi.lib.streamtapeextractor.StreamTapeExtractor +import eu.kanade.tachiyomi.lib.voeextractor.VoeExtractor import eu.kanade.tachiyomi.network.GET +import eu.kanade.tachiyomi.network.POST import eu.kanade.tachiyomi.util.asJsoup +import okhttp3.Headers +import okhttp3.MediaType.Companion.toMediaType import okhttp3.OkHttpClient import okhttp3.Request +import okhttp3.RequestBody.Companion.toRequestBody import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get -import java.lang.Exception -import java.text.Normalizer +import kotlin.Exception class EnNovelas : ConfigurableAnimeSource, ParsedAnimeHttpSource() { override val name = "EnNovelas" - override val baseUrl = "https://www.ennovelas.com" + override val baseUrl = "https://w.ennovelas.net" override val lang = "es" @@ -38,42 +49,59 @@ class EnNovelas : ConfigurableAnimeSource, ParsedAnimeHttpSource() { Injekt.get().getSharedPreferences("source_$id", 0x0000) } - override fun popularAnimeSelector(): String = "#container section.search-videos div.section-content div.row div div.col-xs-6 div.video-post" + override fun popularAnimeSelector(): String = ".block-post" - override fun popularAnimeRequest(page: Int): Request = GET("$baseUrl/?op=categories_all&per_page=60&page=$page") + override fun popularAnimeRequest(page: Int): Request = GET("$baseUrl/telenovelas/page/$page") override fun popularAnimeFromElement(element: Element): SAnime { val anime = SAnime.create() - anime.setUrlWithoutDomain(changeUrlFormat(element.select("a").attr("href"))) - anime.title = element.select("a p").text() - anime.thumbnail_url = element.select("a div.thumb").attr("style") - .substringAfter("background-image:url(").substringBefore(")") + anime.setUrlWithoutDomain(element.select("a").attr("href")) + anime.title = element.select("a .title").text() + anime.thumbnail_url = element.select("a img").attr("data-img") anime.description = "" return anime } - private fun changeUrlFormat(link: String): String { - val novel = link.substringAfter("/category/").replace("+", "%20") - return "$baseUrl/?cat_name=$novel&op=search&per_page=all" - } - - override fun popularAnimeNextPageSelector(): String = "#container section div.section-content div.paging a:last-of-type" + override fun popularAnimeNextPageSelector(): String = ".pagination .current ~ a" override fun episodeListParse(response: Response): List { val document = response.asJsoup() val episodeList = mutableListOf() - document.select("#col3 div.videobox").forEach { element -> - val ep = SEpisode.create() - val noEpisode = getNumberFromEpsString( - element.selectFirst("a:nth-child(2)")!!.text().substringAfter("Cap") - .substringBefore("FIN").substringBefore("fin"), - ) - ep.setUrlWithoutDomain(element.selectFirst("a.video200")!!.attr("href")) - ep.name = "Cap" + element.selectFirst("a:nth-child(2)")!!.text().substringAfter("Cap") - ep.episode_number = noEpisode.toFloat() - episodeList.add(ep) + val seasonIds = document.select(".listSeasons li[data-season]") + var noEp = 1F + if (seasonIds.any()) { + seasonIds.reversed().map { + val headers = headers.newBuilder() + .add("authority", "w.ennovelas.net") + .add("referer", response.request.url.toString()) + .add("accept", "*/*") + .add("accept-language", "es-MX,es;q=0.9,en;q=0.8") + .add("sec-fetch-mode", "cors") + .add("x-requested-with", "XMLHttpRequest") + .build() + val season = getNumberFromEpsString(it.text()) + client.newCall(GET("$baseUrl/wp-content/themes/vo2022/temp/ajax/seasons.php?seriesID=${it.attr("data-season")}", headers = headers)) + .execute().asJsoup().select(".block-post").forEach { element -> + val ep = SEpisode.create() + val noEpisode = getNumberFromEpsString(element.selectFirst("a .episodeNum span:nth-child(2)")!!.text()).ifEmpty { noEp } + ep.setUrlWithoutDomain(element.selectFirst("a")!!.attr("href")) + ep.name = "T$season - E$noEpisode - Cap" + element.selectFirst("a .title")!!.text().substringAfter("Cap") + ep.episode_number = noEp + episodeList.add(ep) + noEp += 1 + } + } + } else { + document.select(".block-post").forEach { element -> + val ep = SEpisode.create() + val noEpisode = getNumberFromEpsString(element.selectFirst("a .episodeNum span:nth-child(2)")!!.text()) + ep.setUrlWithoutDomain(element.selectFirst("a")!!.attr("href")) + ep.name = "Cap" + element.selectFirst("a .title")!!.text().substringAfter("Cap") + ep.episode_number = noEpisode.toFloat() + episodeList.add(ep) + } } - return episodeList.sortedByDescending { x -> x.episode_number } + return episodeList.reversed() } override fun episodeListSelector() = "uwu" @@ -87,16 +115,126 @@ class EnNovelas : ConfigurableAnimeSource, ParsedAnimeHttpSource() { override fun videoListParse(response: Response): List