diff --git a/multisrc/overrides/dooplay/animeonline360/src/AnimeOnline360.kt b/multisrc/overrides/dooplay/animeonline360/src/AnimeOnline360.kt index 787e03add..1dd9e0bf4 100644 --- a/multisrc/overrides/dooplay/animeonline360/src/AnimeOnline360.kt +++ b/multisrc/overrides/dooplay/animeonline360/src/AnimeOnline360.kt @@ -124,12 +124,6 @@ class AnimeOnline360 : DooPlay( } // ============================= Utilities ============================== - - private fun String.toDate(): Long { - return runCatching { DATE_FORMATTER.parse(trim())?.time } - .getOrNull() ?: 0L - } - private fun String.addSubPrefix(): String { return if (this.contains(" dubbed", true)) { "[DUB] ${this.substringBefore(" Dubbed")}" diff --git a/multisrc/overrides/dooplay/animeonlineninja/additional.gradle b/multisrc/overrides/dooplay/animeonlineninja/additional.gradle new file mode 100644 index 000000000..11cfc1ad9 --- /dev/null +++ b/multisrc/overrides/dooplay/animeonlineninja/additional.gradle @@ -0,0 +1,6 @@ +dependencies { + implementation(project(':lib-streamtape-extractor')) + implementation(project(':lib-streamsb-extractor')) + implementation(project(':lib-dood-extractor')) + implementation(project(':lib-mixdrop-extractor')) +} diff --git a/multisrc/overrides/dooplay/animeonlineninja/res/mipmap-hdpi/ic_launcher.png b/multisrc/overrides/dooplay/animeonlineninja/res/mipmap-hdpi/ic_launcher.png new file mode 100644 index 000000000..96334afa7 Binary files /dev/null and b/multisrc/overrides/dooplay/animeonlineninja/res/mipmap-hdpi/ic_launcher.png differ diff --git a/multisrc/overrides/dooplay/animeonlineninja/res/mipmap-mdpi/ic_launcher.png b/multisrc/overrides/dooplay/animeonlineninja/res/mipmap-mdpi/ic_launcher.png new file mode 100644 index 000000000..a0fe394b5 Binary files /dev/null and b/multisrc/overrides/dooplay/animeonlineninja/res/mipmap-mdpi/ic_launcher.png differ diff --git a/multisrc/overrides/dooplay/animeonlineninja/res/mipmap-xhdpi/ic_launcher.png b/multisrc/overrides/dooplay/animeonlineninja/res/mipmap-xhdpi/ic_launcher.png new file mode 100644 index 000000000..6b22aaf80 Binary files /dev/null and b/multisrc/overrides/dooplay/animeonlineninja/res/mipmap-xhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/dooplay/animeonlineninja/res/mipmap-xxhdpi/ic_launcher.png b/multisrc/overrides/dooplay/animeonlineninja/res/mipmap-xxhdpi/ic_launcher.png new file mode 100644 index 000000000..dd2707e3d Binary files /dev/null and b/multisrc/overrides/dooplay/animeonlineninja/res/mipmap-xxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/dooplay/animeonlineninja/res/mipmap-xxxhdpi/ic_launcher.png b/multisrc/overrides/dooplay/animeonlineninja/res/mipmap-xxxhdpi/ic_launcher.png new file mode 100644 index 000000000..479ea7fee Binary files /dev/null and b/multisrc/overrides/dooplay/animeonlineninja/res/mipmap-xxxhdpi/ic_launcher.png differ diff --git a/multisrc/overrides/dooplay/animeonlineninja/src/AnimeOnlineNinja.kt b/multisrc/overrides/dooplay/animeonlineninja/src/AnimeOnlineNinja.kt new file mode 100644 index 000000000..82a25edf9 --- /dev/null +++ b/multisrc/overrides/dooplay/animeonlineninja/src/AnimeOnlineNinja.kt @@ -0,0 +1,260 @@ +package eu.kanade.tachiyomi.animeextension.es.animeonlineninja + +import androidx.preference.CheckBoxPreference +import androidx.preference.ListPreference +import androidx.preference.PreferenceScreen +import eu.kanade.tachiyomi.animeextension.es.animeonlineninja.extractors.UploadExtractor +import eu.kanade.tachiyomi.animesource.model.AnimeFilterList +import eu.kanade.tachiyomi.animesource.model.Video +import eu.kanade.tachiyomi.lib.doodextractor.DoodExtractor +import eu.kanade.tachiyomi.lib.mixdropextractor.MixDropExtractor +import eu.kanade.tachiyomi.lib.streamsbextractor.StreamSBExtractor +import eu.kanade.tachiyomi.lib.streamtapeextractor.StreamTapeExtractor +import eu.kanade.tachiyomi.multisrc.dooplay.DooPlay +import eu.kanade.tachiyomi.network.GET +import eu.kanade.tachiyomi.util.asJsoup +import okhttp3.Request +import okhttp3.Response +import org.jsoup.nodes.Document +import org.jsoup.nodes.Element +import uy.kohesive.injekt.api.get + +class AnimeOnlineNinja : DooPlay( + "es", + "AnimeOnline.Ninja", + "https://www1.animeonline.ninja", +) { + override val client by lazy { + if (preferences.getBoolean(PREF_VRF_INTERCEPT_KEY, PREF_VRF_INTERCEPT_DEFAULT)) { + network.cloudflareClient + .newBuilder().addInterceptor(VrfInterceptor()).build() + } else { + network.cloudflareClient + } + } + + // ============================== Popular =============================== + override fun popularAnimeRequest(page: Int) = GET("$baseUrl/tendencias/$page") + + override fun popularAnimeSelector() = latestUpdatesSelector() + + override fun popularAnimeNextPageSelector() = latestUpdatesNextPageSelector() + + // =============================== Search =============================== + override fun searchAnimeRequest(page: Int, query: String, filters: AnimeFilterList): Request { + val params = AnimeOnlineNinjaFilters.getSearchParameters(filters) + val path = when { + params.genre.isNotBlank() -> { + if (params.genre in listOf("tendencias", "ratings")) { + "/" + params.genre + } else { + "/genero/${params.genre}" + } + } + params.language.isNotBlank() -> "/genero/${params.language}" + params.year.isNotBlank() -> "/release/${params.year}" + params.movie.isNotBlank() -> { + if (params.movie == "pelicula") { + "/pelicula" + } else { + "/genero/${params.movie}" + } + } + else -> buildString { + append( + when { + query.isNotBlank() -> "/?s=$query" + params.letter.isNotBlank() -> "/letra/${params.letter}/?" + else -> "/tendencias/?" + }, + ) + + append( + if (contains("tendencias")) { + "&get=${when (params.type){ + "serie" -> "TV" + "pelicula" -> "movies" + else -> "todos" + }}" + } else { + "&tipo=${params.type}" + }, + ) + + if (params.isInverted) append("&orden=asc") + } + } + + return if (path.startsWith("/?s=")) { + GET("$baseUrl/page/$page$path") + } else if (path.startsWith("/letra") || path.startsWith("/tendencias")) { + val before = path.substringBeforeLast("/") + val after = path.substringAfterLast("/") + GET(baseUrl + before + "/page/$page/" + after) + } else { + GET("$baseUrl$path/page/$page") + } + } + + // ============================== Episodes ============================== + override val episodeMovieText = "Película" + + // ============================ Video Links ============================= + override fun videoListParse(response: Response): List