diff --git a/src/en/nineanime/build.gradle b/src/en/nineanime/build.gradle deleted file mode 100644 index 728eee5b..00000000 --- a/src/en/nineanime/build.gradle +++ /dev/null @@ -1,14 +0,0 @@ -ext { - extName = 'Aniwave' - extClass = '.Aniwave' - extVersionCode = 75 -} - -apply from: "$rootDir/common.gradle" - -dependencies { - implementation(project(':lib:vidsrc-extractor')) - implementation(project(':lib:filemoon-extractor')) - implementation(project(':lib:mp4upload-extractor')) - implementation(project(':lib:streamtape-extractor')) -} diff --git a/src/en/nineanime/res/mipmap-hdpi/ic_launcher.png b/src/en/nineanime/res/mipmap-hdpi/ic_launcher.png deleted file mode 100644 index becbf10b..00000000 Binary files a/src/en/nineanime/res/mipmap-hdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/nineanime/res/mipmap-mdpi/ic_launcher.png b/src/en/nineanime/res/mipmap-mdpi/ic_launcher.png deleted file mode 100644 index 2d4aa387..00000000 Binary files a/src/en/nineanime/res/mipmap-mdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/nineanime/res/mipmap-xhdpi/ic_launcher.png b/src/en/nineanime/res/mipmap-xhdpi/ic_launcher.png deleted file mode 100644 index 268ae9c3..00000000 Binary files a/src/en/nineanime/res/mipmap-xhdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/nineanime/res/mipmap-xxhdpi/ic_launcher.png b/src/en/nineanime/res/mipmap-xxhdpi/ic_launcher.png deleted file mode 100644 index 1df47226..00000000 Binary files a/src/en/nineanime/res/mipmap-xxhdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/nineanime/res/mipmap-xxxhdpi/ic_launcher.png b/src/en/nineanime/res/mipmap-xxxhdpi/ic_launcher.png deleted file mode 100644 index a2a2deea..00000000 Binary files a/src/en/nineanime/res/mipmap-xxxhdpi/ic_launcher.png and /dev/null differ diff --git a/src/en/nineanime/res/web_hi_res_512.png b/src/en/nineanime/res/web_hi_res_512.png deleted file mode 100644 index fb3c714c..00000000 Binary files a/src/en/nineanime/res/web_hi_res_512.png and /dev/null differ diff --git a/src/en/nineanime/src/eu/kanade/tachiyomi/animeextension/en/nineanime/Aniwave.kt b/src/en/nineanime/src/eu/kanade/tachiyomi/animeextension/en/nineanime/Aniwave.kt deleted file mode 100644 index c9d85d87..00000000 --- a/src/en/nineanime/src/eu/kanade/tachiyomi/animeextension/en/nineanime/Aniwave.kt +++ /dev/null @@ -1,538 +0,0 @@ -package eu.kanade.tachiyomi.animeextension.en.nineanime - -import android.app.Application -import android.content.SharedPreferences -import android.webkit.URLUtil -import android.widget.Toast -import androidx.preference.EditTextPreference -import androidx.preference.ListPreference -import androidx.preference.MultiSelectListPreference -import androidx.preference.PreferenceScreen -import androidx.preference.SwitchPreferenceCompat -import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource -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.lib.filemoonextractor.FilemoonExtractor -import eu.kanade.tachiyomi.lib.mp4uploadextractor.Mp4uploadExtractor -import eu.kanade.tachiyomi.lib.streamtapeextractor.StreamTapeExtractor -import eu.kanade.tachiyomi.lib.vidsrcextractor.VidsrcExtractor -import eu.kanade.tachiyomi.network.GET -import eu.kanade.tachiyomi.util.asJsoup -import eu.kanade.tachiyomi.util.parallelFlatMapBlocking -import eu.kanade.tachiyomi.util.parallelMapBlocking -import eu.kanade.tachiyomi.util.parseAs -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.text.SimpleDateFormat -import java.util.Locale - -class Aniwave : ConfigurableAnimeSource, ParsedAnimeHttpSource() { - - override val name = "Aniwave" - - override val id: Long = 98855593379717478 - - override val baseUrl by lazy { - val customDomain = preferences.getString(PREF_CUSTOM_DOMAIN_KEY, null) - if (customDomain.isNullOrBlank()) { - preferences.getString(PREF_DOMAIN_KEY, PREF_DOMAIN_DEFAULT)!! - } else { - customDomain - } - } - - override val lang = "en" - - override val supportsLatest = true - - private val utils by lazy { AniwaveUtils() } - - private val preferences: SharedPreferences by lazy { - Injekt.get().getSharedPreferences("source_$id", 0x0000) - } - - private val refererHeaders = headers.newBuilder().apply { - add("Referer", "$baseUrl/") - }.build() - - private val markFiller by lazy { preferences.getBoolean(PREF_MARK_FILLERS_KEY, PREF_MARK_FILLERS_DEFAULT) } - - // ============================== Popular =============================== - - override fun popularAnimeRequest(page: Int): Request = GET("$baseUrl/filter?sort=trending&page=$page", refererHeaders) - - override fun popularAnimeSelector(): String = "div.ani.items > div.item" - - override fun popularAnimeFromElement(element: Element) = SAnime.create().apply { - element.select("a.name").let { a -> - setUrlWithoutDomain(a.attr("href").substringBefore("?")) - title = a.text() - } - thumbnail_url = element.select("div.poster img").attr("src") - } - - override fun popularAnimeNextPageSelector(): String = - "nav > ul.pagination > li.active ~ li" - - // =============================== Latest =============================== - - override fun latestUpdatesRequest(page: Int): Request = GET("$baseUrl/filter?sort=recently_updated&page=$page", refererHeaders) - - override fun latestUpdatesSelector(): String = popularAnimeSelector() - - override fun latestUpdatesFromElement(element: Element) = popularAnimeFromElement(element) - - override fun latestUpdatesNextPageSelector(): String = popularAnimeNextPageSelector() - - // =============================== Search =============================== - - override fun searchAnimeRequest(page: Int, query: String, filters: AnimeFilterList): Request { - val filters = AniwaveFilters.getSearchParameters(filters) - - val vrf = if (query.isNotBlank()) utils.vrfEncrypt(query) else "" - var url = "$baseUrl/filter?keyword=$query" - - if (filters.genre.isNotBlank()) url += filters.genre - if (filters.country.isNotBlank()) url += filters.country - if (filters.season.isNotBlank()) url += filters.season - if (filters.year.isNotBlank()) url += filters.year - if (filters.type.isNotBlank()) url += filters.type - if (filters.status.isNotBlank()) url += filters.status - if (filters.language.isNotBlank()) url += filters.language - if (filters.rating.isNotBlank()) url += filters.rating - - return GET("$url&sort=${filters.sort}&page=$page&vrf=$vrf", refererHeaders) - } - - override fun searchAnimeSelector(): String = popularAnimeSelector() - - override fun searchAnimeFromElement(element: Element): SAnime = popularAnimeFromElement(element) - - override fun searchAnimeNextPageSelector(): String = popularAnimeNextPageSelector() - - // ============================== Filters =============================== - - override fun getFilterList(): AnimeFilterList = AniwaveFilters.FILTER_LIST - - // =========================== Anime Details ============================ - - override fun animeDetailsParse(document: Document): SAnime { - val anime = SAnime.create() - val newDocument = resolveSearchAnime(anime, document) - anime.apply { - title = newDocument.select("h1.title").text() - genre = newDocument.select("div:contains(Genre) > span > a").joinToString { it.text() } - description = newDocument.select("div.synopsis > div.shorting > div.content").text() - author = newDocument.select("div:contains(Studio) > span > a").text() - status = parseStatus(newDocument.select("div:contains(Status) > span").text()) - - val altName = "Other name(s): " - newDocument.select("h1.title").attr("data-jp").let { - if (it.isNotBlank()) { - description = when { - description.isNullOrBlank() -> altName + it - else -> description + "\n\n$altName" + it - } - } - } - } - return anime - } - - // ============================== Episodes ============================== - - override fun episodeListRequest(anime: SAnime): Request { - val response = client.newCall(GET(baseUrl + anime.url)).execute() - var document = response.asJsoup() - document = resolveSearchAnime(anime, document) - val id = document.selectFirst("div[data-id]")?.attr("data-id") ?: throw Exception("ID not found") - - val vrf = utils.vrfEncrypt(id) - - val listHeaders = headers.newBuilder().apply { - add("Accept", "application/json, text/javascript, */*; q=0.01") - add("Referer", baseUrl + anime.url) - add("X-Requested-With", "XMLHttpRequest") - }.build() - - return GET("$baseUrl/ajax/episode/list/$id?vrf=$vrf#${anime.url}", listHeaders) - } - - override fun episodeListSelector() = "div.episodes ul > li > a" - - override fun episodeListParse(response: Response): List { - val animeUrl = response.request.url.fragment!! - val document = response.parseAs().toDocument() - - val episodeElements = document.select(episodeListSelector()) - return episodeElements.parallelMapBlocking { episodeFromElements(it, animeUrl) }.reversed() - } - - override fun episodeFromElement(element: Element): SEpisode = throw UnsupportedOperationException() - - private fun episodeFromElements(element: Element, url: String): SEpisode { - val title = element.parent()?.attr("title") ?: "" - - val epNum = element.attr("data-num") - val ids = element.attr("data-ids") - val sub = if (element.attr("data-sub").toInt().toBoolean()) "Sub" else "" - val dub = if (element.attr("data-dub").toInt().toBoolean()) "Dub" else "" - val softSub = if (SOFTSUB_REGEX.find(title) != null) "SoftSub" else "" - - val extraInfo = if (element.hasClass("filler") && markFiller) { - " • Filler Episode" - } else { - "" - } - val name = element.parent()?.select("span.d-title")?.text().orEmpty() - val namePrefix = "Episode $epNum" - - return SEpisode.create().apply { - this.name = "Episode $epNum" + - if (name.isNotEmpty() && name != namePrefix) ": $name" else "" - this.url = "$ids&epurl=$url/ep-$epNum" - episode_number = epNum.toFloat() - date_upload = RELEASE_REGEX.find(title)?.let { - parseDate(it.groupValues[1]) - } ?: 0L - scanlator = arrayOf(sub, softSub, dub).filter(String::isNotBlank).joinToString(", ") + extraInfo - } - } - - // ============================ Video Links ============================= - - override fun videoListRequest(episode: SEpisode): Request { - val ids = episode.url.substringBefore("&") - val vrf = utils.vrfEncrypt(ids) - val url = "/ajax/server/list/$ids?vrf=$vrf" - val epurl = episode.url.substringAfter("epurl=") - - val listHeaders = headers.newBuilder().apply { - add("Accept", "application/json, text/javascript, */*; q=0.01") - add("Referer", baseUrl + epurl) - add("X-Requested-With", "XMLHttpRequest") - }.build() - - return GET("$baseUrl$url#$epurl", listHeaders) - } - - data class VideoData( - val type: String, - val serverId: String, - val serverName: String, - ) - - override fun videoListParse(response: Response): List