diff --git a/src/pt/animesaria/AndroidManifest.xml b/src/pt/animesaria/AndroidManifest.xml new file mode 100644 index 000000000..f1050558f --- /dev/null +++ b/src/pt/animesaria/AndroidManifest.xml @@ -0,0 +1,24 @@ + + + + + + + + + + + + + + + + diff --git a/src/pt/animesaria/build.gradle b/src/pt/animesaria/build.gradle new file mode 100644 index 000000000..621ce756f --- /dev/null +++ b/src/pt/animesaria/build.gradle @@ -0,0 +1,13 @@ +plugins { + alias(libs.plugins.android.application) + alias(libs.plugins.kotlin.android) +} + +ext { + extName = 'Animes Aria' + pkgNameSuffix = 'pt.animesaria' + extClass = '.AnimesAria' + extVersionCode = 1 +} + +apply from: "$rootDir/common.gradle" diff --git a/src/pt/animesaria/res/mipmap-hdpi/ic_launcher.png b/src/pt/animesaria/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..44beffdb4 Binary files /dev/null and b/src/pt/animesaria/res/mipmap-hdpi/ic_launcher.png differ diff --git a/src/pt/animesaria/res/mipmap-mdpi/ic_launcher.png b/src/pt/animesaria/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..e81b08685 Binary files /dev/null and b/src/pt/animesaria/res/mipmap-mdpi/ic_launcher.png differ diff --git a/src/pt/animesaria/res/mipmap-xhdpi/ic_launcher.png b/src/pt/animesaria/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..36ea0ab4a Binary files /dev/null and b/src/pt/animesaria/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/src/pt/animesaria/res/mipmap-xxhdpi/ic_launcher.png b/src/pt/animesaria/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..13dbec3a0 Binary files /dev/null and b/src/pt/animesaria/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/src/pt/animesaria/res/mipmap-xxxhdpi/ic_launcher.png b/src/pt/animesaria/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..a834a4faa Binary files /dev/null and b/src/pt/animesaria/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/src/pt/animesaria/src/eu/kanade/tachiyomi/animeextension/pt/animesaria/AnimesAria.kt b/src/pt/animesaria/src/eu/kanade/tachiyomi/animeextension/pt/animesaria/AnimesAria.kt new file mode 100644 index 000000000..e172e1d4e --- /dev/null +++ b/src/pt/animesaria/src/eu/kanade/tachiyomi/animeextension/pt/animesaria/AnimesAria.kt @@ -0,0 +1,197 @@ +package eu.kanade.tachiyomi.animeextension.pt.animesaria + +import eu.kanade.tachiyomi.animeextension.pt.animesaria.extractors.LinkfunBypasser +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.HttpUrl.Companion.toHttpUrl +import okhttp3.Request +import okhttp3.Response +import org.jsoup.nodes.Document +import org.jsoup.nodes.Element +import rx.Observable + +class AnimesAria : ParsedAnimeHttpSource() { + + override val name = "Animes Aria" + + override val baseUrl = "https://animesaria.com" + + override val lang = "pt-BR" + + override val supportsLatest = true + + // ============================== Popular =============================== + override fun popularAnimeFromElement(element: Element): SAnime { + return SAnime.create().apply { + setUrlWithoutDomain(element.attr("href")) + title = element.attr("title") + thumbnail_url = element.selectFirst("img")!!.attr("src") + } + } + + override fun popularAnimeNextPageSelector() = latestUpdatesNextPageSelector() + + override fun popularAnimeRequest(page: Int) = GET("$baseUrl/novos/animes?page=$page") + + override fun popularAnimeSelector() = "div.item > a" + + // ============================== Episodes ============================== + override fun episodeListParse(response: Response) = super.episodeListParse(response).reversed() + + override fun episodeFromElement(element: Element): SEpisode { + return SEpisode.create().apply { + element.parent()!!.selectFirst("a > b")!!.ownText().let { + name = it + episode_number = it.substringAfter(" ").toFloat() + } + setUrlWithoutDomain(element.attr("href")) + scanlator = element.text().substringAfter(" ") // sub/dub + } + } + + override fun episodeListSelector() = "td div.clear > a.btn-xs" + + // =========================== Anime Details ============================ + override fun animeDetailsParse(document: Document): SAnime { + return SAnime.create().apply { + val row = document.selectFirst("div.anime_background_w div.row")!! + title = row.selectFirst("h1 > span")!!.text() + status = row.selectFirst("div.clear span.btn")?.text().toStatus() + thumbnail_url = document.selectFirst("link[as=image]")!!.attr("href") + genre = row.select("div.clear a.btn").eachText().joinToString() + + description = buildString { + document.selectFirst("li.active > small")!! + .ownText() + .substringAfter(": ") + .let(::append) + + append("\n\n") + + row.selectFirst("h1 > small")?.text()?.let { + append("Títulos Alternativos: $it\n") + } + + // Additional info + row.select("div.pull-right > a").forEach { + val title = it.selectFirst("small")!!.text() + val value = it.selectFirst("span")!!.text() + append("$title: $value\n") + } + } + } + } + + // ============================ Video Links ============================= + override fun videoListParse(response: Response): List