diff --git a/src/pt/animesup/AndroidManifest.xml b/src/pt/animesup/AndroidManifest.xml new file mode 100644 index 000000000..73ab05bf8 --- /dev/null +++ b/src/pt/animesup/AndroidManifest.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + diff --git a/src/pt/animesup/build.gradle b/src/pt/animesup/build.gradle new file mode 100644 index 000000000..1eb306478 --- /dev/null +++ b/src/pt/animesup/build.gradle @@ -0,0 +1,16 @@ +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' + +ext { + extName = 'AnimesUP' + pkgNameSuffix = 'pt.animesup' + extClass = '.AnimesUp' + extVersionCode = 1 + libVersion = '13' +} + +dependencies { + implementation "dev.datlag.jsunpacker:jsunpacker:1.0.1" +} + +apply from: "$rootDir/common.gradle" diff --git a/src/pt/animesup/res/mipmap-hdpi/ic_launcher.png b/src/pt/animesup/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..680ccb519 Binary files /dev/null and b/src/pt/animesup/res/mipmap-hdpi/ic_launcher.png differ diff --git a/src/pt/animesup/res/mipmap-mdpi/ic_launcher.png b/src/pt/animesup/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..842fc91c9 Binary files /dev/null and b/src/pt/animesup/res/mipmap-mdpi/ic_launcher.png differ diff --git a/src/pt/animesup/res/mipmap-xhdpi/ic_launcher.png b/src/pt/animesup/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..839118dc1 Binary files /dev/null and b/src/pt/animesup/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/src/pt/animesup/res/mipmap-xxhdpi/ic_launcher.png b/src/pt/animesup/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..567cf548f Binary files /dev/null and b/src/pt/animesup/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/src/pt/animesup/res/mipmap-xxxhdpi/ic_launcher.png b/src/pt/animesup/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..43e923eea Binary files /dev/null and b/src/pt/animesup/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/src/pt/animesup/src/eu/kanade/tachiyomi/animeextension/pt/animesup/AnimesUp.kt b/src/pt/animesup/src/eu/kanade/tachiyomi/animeextension/pt/animesup/AnimesUp.kt new file mode 100644 index 000000000..96f485f8c --- /dev/null +++ b/src/pt/animesup/src/eu/kanade/tachiyomi/animeextension/pt/animesup/AnimesUp.kt @@ -0,0 +1,269 @@ +package eu.kanade.tachiyomi.animeextension.pt.animesup + +import android.net.Uri +import eu.kanade.tachiyomi.animeextension.pt.animesup.extractors.AnimesUpExtractor +import eu.kanade.tachiyomi.animeextension.pt.animesup.extractors.LegacyFunExtractor +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.network.GET +import eu.kanade.tachiyomi.network.asObservableSuccess +import eu.kanade.tachiyomi.util.asJsoup +import okhttp3.Headers +import okhttp3.OkHttpClient +import okhttp3.Request +import okhttp3.Response +import org.jsoup.nodes.Document +import org.jsoup.nodes.Element +import rx.Observable +import uy.kohesive.injekt.api.get +import java.lang.Exception + +class AnimesUp : ParsedAnimeHttpSource() { + + override val name = "AnimesUp" + + override val baseUrl = "https://animesup.biz" + + override val lang = "pt-BR" + + override val supportsLatest = true + + override val client: OkHttpClient = network.client + + override fun headersBuilder(): Headers.Builder = Headers.Builder() + .add("Referer", baseUrl) + + // ============================== Popular =============================== + override fun popularAnimeSelector(): String = "article.w_item_b > a" + + override fun popularAnimeRequest(page: Int): Request = GET("$baseUrl/animes/") + + override fun popularAnimeFromElement(element: Element): SAnime { + val anime = SAnime.create() + val img = element.selectFirst("img") + val url = element.selectFirst("a")?.attr("href") ?: element.attr("href") + anime.setUrlWithoutDomain(url) + anime.title = img.attr("alt") + anime.thumbnail_url = img.attr("src") + return anime + } + + override fun popularAnimeNextPageSelector() = throw Exception("not used") + + override fun popularAnimeParse(response: Response): AnimesPage { + val document = response.asJsoup() + val animes = document.select(popularAnimeSelector()).map { element -> + popularAnimeFromElement(element) + } + return AnimesPage(animes, false) + } + + // ============================== Episodes ============================== + override fun episodeListSelector(): String = "ul.episodios > li" + + override fun episodeListParse(response: Response): List { + val doc = getRealDoc(response.asJsoup()) + val epList = doc.select(episodeListSelector()) + if (epList.size < 1) { + val episode = SEpisode.create() + episode.setUrlWithoutDomain(response.request.url.toString()) + episode.episode_number = 1F + episode.name = "Filme" + return listOf(episode) + } + return epList.reversed().map { episodeFromElement(it) } + } + + override fun episodeFromElement(element: Element): SEpisode { + val episode = SEpisode.create() + val origName = element.selectFirst("div.numerando").text() + + episode.episode_number = origName.substringAfter("- ") + .replace("-", "") + .toFloat() + episode.name = "Temp " + origName.replace(" - ", ": Ep ") + episode.setUrlWithoutDomain(element.selectFirst("a").attr("href")) + return episode + } + + // ============================ Video Links ============================= + + override fun videoListParse(response: Response): List