diff --git a/src/it/animesaturn/AndroidManifest.xml b/src/it/animesaturn/AndroidManifest.xml new file mode 100644 index 000000000..acb4de356 --- /dev/null +++ b/src/it/animesaturn/AndroidManifest.xml @@ -0,0 +1,2 @@ + + \ No newline at end of file diff --git a/src/it/animesaturn/build.gradle b/src/it/animesaturn/build.gradle new file mode 100644 index 000000000..5201f4f30 --- /dev/null +++ b/src/it/animesaturn/build.gradle @@ -0,0 +1,12 @@ +apply plugin: 'com.android.application' +apply plugin: 'kotlin-android' + +ext { + extName = 'Anime Saturn' + pkgNameSuffix = 'it.animesaturn' + extClass = '.AnimeSaturn' + extVersionCode = 1 + libVersion = '12' +} + +apply from: "$rootDir/common.gradle" diff --git a/src/it/animesaturn/res/mipmap-hdpi/ic_launcher.png b/src/it/animesaturn/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..dc71afc8b Binary files /dev/null and b/src/it/animesaturn/res/mipmap-hdpi/ic_launcher.png differ diff --git a/src/it/animesaturn/res/mipmap-mdpi/ic_launcher.png b/src/it/animesaturn/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..fe9b785b0 Binary files /dev/null and b/src/it/animesaturn/res/mipmap-mdpi/ic_launcher.png differ diff --git a/src/it/animesaturn/res/mipmap-xhdpi/ic_launcher.png b/src/it/animesaturn/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..ecd21189f Binary files /dev/null and b/src/it/animesaturn/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/src/it/animesaturn/res/mipmap-xxhdpi/ic_launcher.png b/src/it/animesaturn/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..e3be256ac Binary files /dev/null and b/src/it/animesaturn/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/src/it/animesaturn/res/mipmap-xxxhdpi/ic_launcher.png b/src/it/animesaturn/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..b6008ca54 Binary files /dev/null and b/src/it/animesaturn/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/src/it/animesaturn/src/eu/kanade/tachiyomi/animeextension/it/animesaturn/AnimeSaturn.kt b/src/it/animesaturn/src/eu/kanade/tachiyomi/animeextension/it/animesaturn/AnimeSaturn.kt new file mode 100644 index 000000000..fd18a4bbc --- /dev/null +++ b/src/it/animesaturn/src/eu/kanade/tachiyomi/animeextension/it/animesaturn/AnimeSaturn.kt @@ -0,0 +1,417 @@ +package eu.kanade.tachiyomi.animeextension.it.animesaturn + +import android.app.Application +import android.content.SharedPreferences +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 okhttp3.Headers +import okhttp3.OkHttpClient +import okhttp3.Request +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 + +class AnimeSaturn : ConfigurableAnimeSource, ParsedAnimeHttpSource() { + + override val name = "AnimeSaturn" + + override val baseUrl by lazy { preferences.getString("preferred_domain", "https://animesaturn.it")!! } + + override val lang = "it" + + override val supportsLatest = true + + override val client: OkHttpClient = network.cloudflareClient + + private val preferences: SharedPreferences by lazy { + Injekt.get().getSharedPreferences("source_$id", 0x0000) + } + + override fun popularAnimeSelector(): String = "div.sebox" + + override fun popularAnimeRequest(page: Int): Request = GET("$baseUrl/animeincorso?page=$page") + + private fun formatTitle(titlestring: String): String = titlestring.replace("(ITA) ITA", "Dub ITA").replace("(ITA)", "Dub ITA").replace("Sub ITA", "") + + override fun popularAnimeFromElement(element: Element): SAnime { + val anime = SAnime.create() + anime.setUrlWithoutDomain(element.selectFirst("div.msebox div.headsebox div.tisebox h2 a").attr("href")) + anime.title = formatTitle(element.selectFirst("div.msebox div.headsebox div.tisebox h2 a").text()) + anime.thumbnail_url = element.selectFirst("div.msebox div.bigsebox div.l img.attachment-post-thumbnail.size-post-thumbnail.wp-post-image").attr("src") + return anime + } + + override fun popularAnimeNextPageSelector(): String = "li.page-item.active:not(li:last-child)" + + override fun episodeListParse(response: Response): List { + val document = response.asJsoup() + return document.select(episodeListSelector()).map { episodeFromElement(it) }.reversed() + } + + override fun episodeListSelector() = "div.btn-group.episodes-button.episodi-link-button" + + override fun episodeFromElement(element: Element): SEpisode { + val episode = SEpisode.create() + episode.setUrlWithoutDomain(element.selectFirst("a.btn.btn-dark.mb-1.bottone-ep").attr("href")) + val epText = element.selectFirst("a.btn.btn-dark.mb-1.bottone-ep").text() + val epNumber = epText.substringAfter("Episodio ") + if (epNumber.contains("-", true)) { + episode.episode_number = epNumber.substringBefore("-").toFloat() + } else { + episode.episode_number = epNumber.toFloat() + } + episode.name = epText + episode.date_upload = System.currentTimeMillis() + return episode + } + + override fun videoListRequest(episode: SEpisode): Request { + val episodePage = client.newCall(GET(baseUrl + episode.url)).execute().asJsoup() + val watchUrl = episodePage.select("a[href*=/watch]").attr("href") + return GET(watchUrl) + } + + override fun videoListSelector() = "source" + + override fun videoFromElement(element: Element): Video { + val referer = element.ownerDocument().location() + val url = element.attr("src") + return Video(url, "Qualità predefinita", url, null, Headers.headersOf("Referer", referer)) + } + + // override fun List