diff --git a/src/pt/animesdigital/AndroidManifest.xml b/src/pt/animesdigital/AndroidManifest.xml new file mode 100644 index 000000000..fc8e8e1e5 --- /dev/null +++ b/src/pt/animesdigital/AndroidManifest.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + diff --git a/src/pt/animesdigital/build.gradle b/src/pt/animesdigital/build.gradle new file mode 100644 index 000000000..a3268a271 --- /dev/null +++ b/src/pt/animesdigital/build.gradle @@ -0,0 +1,18 @@ +plugins { + alias(libs.plugins.android.application) + alias(libs.plugins.kotlin.android) + alias(libs.plugins.kotlin.serialization) +} + +ext { + extName = 'Animes Digital' + pkgNameSuffix = 'pt.animesdigital' + extClass = '.AnimesDigital' + extVersionCode = 1 +} + +dependencies { + implementation(project(":lib-unpacker")) +} + +apply from: "$rootDir/common.gradle" diff --git a/src/pt/animesdigital/res/mipmap-hdpi/ic_launcher.png b/src/pt/animesdigital/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..89327846c Binary files /dev/null and b/src/pt/animesdigital/res/mipmap-hdpi/ic_launcher.png differ diff --git a/src/pt/animesdigital/res/mipmap-mdpi/ic_launcher.png b/src/pt/animesdigital/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..945328f65 Binary files /dev/null and b/src/pt/animesdigital/res/mipmap-mdpi/ic_launcher.png differ diff --git a/src/pt/animesdigital/res/mipmap-xhdpi/ic_launcher.png b/src/pt/animesdigital/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..0e16b7059 Binary files /dev/null and b/src/pt/animesdigital/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/src/pt/animesdigital/res/mipmap-xxhdpi/ic_launcher.png b/src/pt/animesdigital/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..c6b98f1e3 Binary files /dev/null and b/src/pt/animesdigital/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/src/pt/animesdigital/res/mipmap-xxxhdpi/ic_launcher.png b/src/pt/animesdigital/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..b5330a4aa Binary files /dev/null and b/src/pt/animesdigital/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/src/pt/animesdigital/src/eu/kanade/tachiyomi/animeextension/pt/animesdigital/AnimesDigital.kt b/src/pt/animesdigital/src/eu/kanade/tachiyomi/animeextension/pt/animesdigital/AnimesDigital.kt new file mode 100644 index 000000000..5fa82b0c3 --- /dev/null +++ b/src/pt/animesdigital/src/eu/kanade/tachiyomi/animeextension/pt/animesdigital/AnimesDigital.kt @@ -0,0 +1,325 @@ +package eu.kanade.tachiyomi.animeextension.pt.animesdigital + +import android.app.Application +import androidx.preference.ListPreference +import androidx.preference.PreferenceScreen +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.unpacker.Unpacker +import eu.kanade.tachiyomi.network.GET +import eu.kanade.tachiyomi.network.POST +import eu.kanade.tachiyomi.network.asObservableSuccess +import eu.kanade.tachiyomi.util.asJsoup +import kotlinx.serialization.Serializable +import kotlinx.serialization.decodeFromString +import kotlinx.serialization.json.Json +import okhttp3.FormBody +import okhttp3.HttpUrl.Companion.toHttpUrl +import okhttp3.Request +import okhttp3.Response +import org.jsoup.Jsoup +import org.jsoup.nodes.Document +import org.jsoup.nodes.Element +import rx.Observable +import uy.kohesive.injekt.Injekt +import uy.kohesive.injekt.api.get +import uy.kohesive.injekt.injectLazy + +class AnimesDigital : ConfigurableAnimeSource, ParsedAnimeHttpSource() { + + override val name = "Animes Digital" + + override val baseUrl = "https://animesdigital.org" + + override val lang = "pt-BR" + + override val supportsLatest = true + + override fun headersBuilder() = super.headersBuilder().add("Referer", baseUrl) + + private val json: Json by injectLazy() + + private val preferences by lazy { + Injekt.get().getSharedPreferences("source_$id", 0x0000) + } + + // ============================== Popular =============================== + override fun popularAnimeFromElement(element: Element) = latestUpdatesFromElement(element) + override fun popularAnimeNextPageSelector() = null + override fun popularAnimeRequest(page: Int) = GET(baseUrl) + override fun popularAnimeSelector() = latestUpdatesSelector() + + // ============================== Episodes ============================== + override fun episodeListParse(response: Response): List { + val doc = getRealDoc(response.asJsoup()) + return doc.select(episodeListSelector()).map(::episodeFromElement) + } + + override fun episodeFromElement(element: Element) = SEpisode.create().apply { + setUrlWithoutDomain(element.attr("href")) + val epname = element.selectFirst("div.episode")!!.text() + episode_number = epname.substringAfterLast(" ").toFloatOrNull() ?: 1F + name = buildString { + append(epname) + element.selectFirst("div.sub_title")?.text()?.let { + if (!it.contains("Ainda não tem um titulo oficial")) { + append(" - $it") + } + } + } + } + + override fun episodeListSelector() = "div.item_ep > a" + + // =========================== Anime Details ============================ + override fun animeDetailsParse(document: Document) = SAnime.create().apply { + val doc = getRealDoc(document) + setUrlWithoutDomain(doc.location()) + thumbnail_url = doc.selectFirst("div.poster > img")!!.attr("data-lazy-src") + status = when (doc.selectFirst("div.clw > div.playon")?.text()) { + "Em Lançamento" -> SAnime.ONGOING + "Completo" -> SAnime.COMPLETED + else -> SAnime.UNKNOWN + } + + val infos = doc.selectFirst("div.crw > div.dados")!! + + artist = infos.getInfo("Estúdio") + author = infos.getInfo("Autor") ?: infos.getInfo("Diretor") + + title = infos.selectFirst("h1")!!.text() + genre = infos.select("div.genre a").eachText().joinToString() + + description = infos.selectFirst("div.sinopse")?.text() + } + + // ============================ Video Links ============================= + override fun videoListParse(response: Response): List