diff --git a/src/pt/animesvision/AndroidManifest.xml b/src/pt/animesvision/AndroidManifest.xml index 94339ee7a..9365278ac 100644 --- a/src/pt/animesvision/AndroidManifest.xml +++ b/src/pt/animesvision/AndroidManifest.xml @@ -1,2 +1,24 @@ - + + + + + + + + + + + + + + + diff --git a/src/pt/animesvision/build.gradle b/src/pt/animesvision/build.gradle index 2cd3f68d9..fc8d549fe 100644 --- a/src/pt/animesvision/build.gradle +++ b/src/pt/animesvision/build.gradle @@ -6,12 +6,13 @@ ext { extName = 'AnimesVision' pkgNameSuffix = 'pt.animesvision' extClass = '.AnimesVision' - extVersionCode = 4 + extVersionCode = 5 libVersion = '12' } dependencies { compileOnly 'org.jetbrains.kotlinx:kotlinx-serialization-json:1.3.2' + implementation "org.jetbrains.kotlin:kotlin-stdlib:$kotlin_version" } apply from: "$rootDir/common.gradle" diff --git a/src/pt/animesvision/src/eu/kanade/tachiyomi/animeextension/pt/animesvision/AVUrlActivity.kt b/src/pt/animesvision/src/eu/kanade/tachiyomi/animeextension/pt/animesvision/AVUrlActivity.kt new file mode 100644 index 000000000..c4c72c25b --- /dev/null +++ b/src/pt/animesvision/src/eu/kanade/tachiyomi/animeextension/pt/animesvision/AVUrlActivity.kt @@ -0,0 +1,43 @@ +package eu.kanade.tachiyomi.animeextension.pt.animesvision + +import android.app.Activity +import android.content.ActivityNotFoundException +import android.content.Intent +import android.os.Bundle +import android.util.Log +import kotlin.system.exitProcess + +/** + * Springboard that accepts https://animes.vision// intents + * and redirects them to the main Aniyomi process. + */ +class AVUrlActivity : Activity() { + + private val TAG = "AVUrlActivity" + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + val pathSegments = intent?.data?.pathSegments + if (pathSegments != null && pathSegments.size > 1) { + val type = pathSegments[0] + val item = pathSegments[1] + val searchQuery = "$type/$item" + val mainIntent = Intent().apply { + action = "eu.kanade.tachiyomi.ANIMESEARCH" + putExtra("query", "${AnimesVision.PREFIX_SEARCH}$searchQuery") + putExtra("filter", packageName) + } + + try { + startActivity(mainIntent) + } catch (e: ActivityNotFoundException) { + Log.e(TAG, e.toString()) + } + } else { + Log.e(TAG, "could not parse uri from intent $intent") + } + + finish() + exitProcess(0) + } +} diff --git a/src/pt/animesvision/src/eu/kanade/tachiyomi/animeextension/pt/animesvision/AnimesVision.kt b/src/pt/animesvision/src/eu/kanade/tachiyomi/animeextension/pt/animesvision/AnimesVision.kt index 4ddc4c473..0defd4303 100644 --- a/src/pt/animesvision/src/eu/kanade/tachiyomi/animeextension/pt/animesvision/AnimesVision.kt +++ b/src/pt/animesvision/src/eu/kanade/tachiyomi/animeextension/pt/animesvision/AnimesVision.kt @@ -11,6 +11,7 @@ import eu.kanade.tachiyomi.animeextension.pt.animesvision.dto.PayloadItem import eu.kanade.tachiyomi.animeextension.pt.animesvision.extractors.DoodExtractor import eu.kanade.tachiyomi.animeextension.pt.animesvision.extractors.GlobalVisionExtractor import eu.kanade.tachiyomi.animeextension.pt.animesvision.extractors.StreamTapeExtractor +import eu.kanade.tachiyomi.animeextension.pt.animesvision.extractors.VoeExtractor import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource import eu.kanade.tachiyomi.animesource.model.AnimeFilterList import eu.kanade.tachiyomi.animesource.model.AnimesPage @@ -146,12 +147,14 @@ class AnimesVision : ConfigurableAnimeSource, ParsedAnimeHttpSource() { val hosts_ids = mutableListOf() val ignoredHosts = preferences.getStringSet(IGNORED_HOSTS, null) - val ignoreDO = ignoredHosts?.contains(HOSTS_NAMES.elementAt(1)) ?: false - val ignoreST = ignoredHosts?.contains(HOSTS_NAMES.elementAt(2)) ?: false + val ignoreDO = ignoredHosts?.contains(HOSTS_NAMES.elementAt(0)) ?: false + val ignoreST = ignoredHosts?.contains(HOSTS_NAMES.elementAt(1)) ?: false + val ignoreVO = ignoredHosts?.contains(HOSTS_NAMES.elementAt(2)) ?: false if (!ignoreST && "Streamtape" in players) hosts_ids.add(5) - + if (!ignoreVO && "Voe CDN" in players) + hosts_ids.add(7) if (!ignoreDO && "DOOD" in players) hosts_ids.add(8) @@ -174,15 +177,19 @@ class AnimesVision : ConfigurableAnimeSource, ParsedAnimeHttpSource() { it.text() } val videoList = GlobalVisionExtractor() - .videoListFromHtml(doc.html(), players) + .videoListFromHtml(doc.html()) .toMutableList() getPlayersUrl(doc, players).forEach { - val video = if (it.contains("streamtape")) { - StreamTapeExtractor(client).videoFromUrl(it) - } else if (it.contains("dood")) { - DoodExtractor(client).videoFromUrl(it) - } else { null } + val video = when { + "streamtape" in it -> + StreamTapeExtractor(client).videoFromUrl(it) + "dood" in it -> + DoodExtractor(client).videoFromUrl(it) + "voe.sx" in it -> + VoeExtractor(client).videoFromUrl(it) + else -> null + } if (video != null) videoList.add(video) } @@ -208,12 +215,27 @@ class AnimesVision : ConfigurableAnimeSource, ParsedAnimeHttpSource() { override fun searchAnimeSelector(): String = "div.film_list-wrap div.film-poster" override fun fetchSearchAnime(page: Int, query: String, filters: AnimeFilterList): Observable { - val params = AVFilters.getSearchParameters(filters) - return client.newCall(searchAnimeRequest(page, query, params)) - .asObservableSuccess() - .map { response -> - searchAnimeParse(response) - } + return if (query.startsWith(PREFIX_SEARCH)) { + val path = query.removePrefix(PREFIX_SEARCH) + client.newCall(GET("$baseUrl/$path")) + .asObservableSuccess() + .map { response -> + searchAnimeByPathParse(response, path) + } + } else { + val params = AVFilters.getSearchParameters(filters) + client.newCall(searchAnimeRequest(page, query, params)) + .asObservableSuccess() + .map { response -> + searchAnimeParse(response) + } + } + } + + private fun searchAnimeByPathParse(response: Response, path: String): AnimesPage { + val details = animeDetailsParse(response) + details.url = "/$path" + return AnimesPage(listOf(details), false) } override fun searchAnimeRequest(page: Int, query: String, filters: AnimeFilterList): Request = throw Exception("not used") @@ -281,23 +303,6 @@ class AnimesVision : ConfigurableAnimeSource, ParsedAnimeHttpSource() { // ============================== Settings ============================== override fun setupPreferenceScreen(screen: PreferenceScreen) { - - val videoServerPref = ListPreference(screen.context).apply { - key = PREFERRED_HOST - title = "Host preferido" - entries = HOSTS_NAMES - entryValues = HOSTS_URLS - setDefaultValue(HOSTS_URLS.first()) - summary = "%s" - - setOnPreferenceChangeListener { _, newValue -> - val selected = newValue as String - val index = findIndexOfValue(selected) - val entry = entryValues[index] as String - preferences.edit().putString(key, entry).commit() - } - } - val videoQualityPref = ListPreference(screen.context).apply { key = PREFERRED_QUALITY title = "Qualidade preferida (VĂ¡lido apenas no GlobalVision)" @@ -314,11 +319,10 @@ class AnimesVision : ConfigurableAnimeSource, ParsedAnimeHttpSource() { } val ignoredHosts = MultiSelectListPreference(screen.context).apply { - val values = HOSTS_NAMES.drop(1).toTypedArray() key = IGNORED_HOSTS title = "Hosts ignorados ao carregar" - entries = values - entryValues = values + entries = HOSTS_NAMES + entryValues = HOSTS_NAMES setDefaultValue(emptySet()) setOnPreferenceChangeListener { _, newValue -> preferences.edit() @@ -327,7 +331,6 @@ class AnimesVision : ConfigurableAnimeSource, ParsedAnimeHttpSource() { } } - screen.addPreference(videoServerPref) screen.addPreference(videoQualityPref) screen.addPreference(ignoredHosts) } @@ -375,29 +378,19 @@ class AnimesVision : ConfigurableAnimeSource, ParsedAnimeHttpSource() { } override fun List