From dbb7ee642ab7cde7c07ca96f1f3daba4e7987ec7 Mon Sep 17 00:00:00 2001
From: Claudemirovsky <63046606+Claudemirovsky@users.noreply.github.com>
Date: Sat, 16 Jul 2022 06:47:38 -0300
Subject: [PATCH] AnimesVision: Fix GlobalVision extractor and add URL intent
handler (#666)
* AnimesVision: Add VoeExtractor
* AnimesVision: fix GlobalVision extractor
* AnimesVision: Bump version
* AnimesVision: Remove 'useless' config and reimplement video sorter
* AnimesVision: Add URL Intent handler
---
src/pt/animesvision/AndroidManifest.xml | 24 +++-
src/pt/animesvision/build.gradle | 3 +-
.../pt/animesvision/AVUrlActivity.kt | 43 ++++++++
.../pt/animesvision/AnimesVision.kt | 104 ++++++++----------
.../animesvision/extractors/DoodExtractor.kt | 2 +-
.../extractors/GlobalVisionExtractor.kt | 23 ++--
.../animesvision/extractors/VoeExtractor.kt | 21 ++++
7 files changed, 145 insertions(+), 75 deletions(-)
create mode 100644 src/pt/animesvision/src/eu/kanade/tachiyomi/animeextension/pt/animesvision/AVUrlActivity.kt
create mode 100644 src/pt/animesvision/src/eu/kanade/tachiyomi/animeextension/pt/animesvision/extractors/VoeExtractor.kt
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