From e9a8995bee46dcd8e057a0565f207a7c1a1c5366 Mon Sep 17 00:00:00 2001 From: WebDitto Date: Sat, 29 Jun 2024 16:38:06 -0300 Subject: [PATCH 1/3] feat(pt/animeq): Added support to Url Activity to pt/AnimeQ --- src/pt/animeq/AndroidManifest.xml | 23 ++++++++++ src/pt/animeq/build.gradle | 2 +- .../animeextension/pt/animeq/AnimeQ.kt | 23 ++++++++++ .../pt/animeq/AnimeQUrlActivity.kt | 42 +++++++++++++++++++ 4 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 src/pt/animeq/AndroidManifest.xml create mode 100644 src/pt/animeq/src/eu/kanade/tachiyomi/animeextension/pt/animeq/AnimeQUrlActivity.kt diff --git a/src/pt/animeq/AndroidManifest.xml b/src/pt/animeq/AndroidManifest.xml new file mode 100644 index 00000000..19f3f557 --- /dev/null +++ b/src/pt/animeq/AndroidManifest.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + diff --git a/src/pt/animeq/build.gradle b/src/pt/animeq/build.gradle index 4c137754..99c77ee6 100644 --- a/src/pt/animeq/build.gradle +++ b/src/pt/animeq/build.gradle @@ -1,7 +1,7 @@ ext { extName = 'AnimeQ' extClass = '.AnimeQ' - extVersionCode = 1 + extVersionCode = 2 isNsfw = true } diff --git a/src/pt/animeq/src/eu/kanade/tachiyomi/animeextension/pt/animeq/AnimeQ.kt b/src/pt/animeq/src/eu/kanade/tachiyomi/animeextension/pt/animeq/AnimeQ.kt index 600760c6..3e040747 100644 --- a/src/pt/animeq/src/eu/kanade/tachiyomi/animeextension/pt/animeq/AnimeQ.kt +++ b/src/pt/animeq/src/eu/kanade/tachiyomi/animeextension/pt/animeq/AnimeQ.kt @@ -6,12 +6,14 @@ import androidx.preference.ListPreference import androidx.preference.PreferenceScreen import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource import eu.kanade.tachiyomi.animesource.model.AnimeFilterList +import eu.kanade.tachiyomi.animesource.model.AnimesPage 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.bloggerextractor.BloggerExtractor import eu.kanade.tachiyomi.network.GET +import eu.kanade.tachiyomi.network.awaitSuccess import eu.kanade.tachiyomi.util.asJsoup import eu.kanade.tachiyomi.util.parallelCatchingFlatMapBlocking import okhttp3.HttpUrl.Companion.toHttpUrl @@ -67,6 +69,25 @@ class AnimeQ : ConfigurableAnimeSource, ParsedAnimeHttpSource() { override fun latestUpdatesNextPageSelector() = "div.ContainerEps a.next.page-numbers" // =============================== Search =============================== + override suspend fun getSearchAnime(page: Int, query: String, filters: AnimeFilterList): AnimesPage { + return if (query.startsWith(PREFIX_SEARCH)) { + val path = query.removePrefix(PREFIX_SEARCH) + client.newCall(GET("$baseUrl/$path")) + .awaitSuccess() + .use(::searchAnimeByIdParse) + } else { + super.getSearchAnime(page, query, filters) + } + } + + private fun searchAnimeByIdParse(response: Response): AnimesPage { + val details = animeDetailsParse(response).apply { + setUrlWithoutDomain(response.request.url.toString()) + initialized = true + } + + return AnimesPage(listOf(details), false) + } override fun searchAnimeRequest(page: Int, query: String, filters: AnimeFilterList): Request { val url = "$baseUrl/page".toHttpUrl().newBuilder() .addPathSegment(page.toString()) @@ -249,6 +270,8 @@ class AnimeQ : ConfigurableAnimeSource, ParsedAnimeHttpSource() { } companion object { + const val PREFIX_SEARCH = "id:" + private val REGEX_QUALITY by lazy { Regex("""(\d+)p""") } private val REGEX_NUMBER by lazy { Regex("""\d+""") } diff --git a/src/pt/animeq/src/eu/kanade/tachiyomi/animeextension/pt/animeq/AnimeQUrlActivity.kt b/src/pt/animeq/src/eu/kanade/tachiyomi/animeextension/pt/animeq/AnimeQUrlActivity.kt new file mode 100644 index 00000000..72f016f0 --- /dev/null +++ b/src/pt/animeq/src/eu/kanade/tachiyomi/animeextension/pt/animeq/AnimeQUrlActivity.kt @@ -0,0 +1,42 @@ +package eu.kanade.tachiyomi.animeextension.pt.animeq + +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://animeq.blog/ intents + * and redirects them to the main Aniyomi process. + */ +class AnimeQUrlActivity : Activity() { + + private val tag = javaClass.simpleName + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + val pathSegments = intent?.data?.pathSegments + if (pathSegments != null && pathSegments.size > 0) { + val searchQuery = pathSegments[0] + + val mainIntent = Intent().apply { + action = "eu.kanade.tachiyomi.ANIMESEARCH" + putExtra("query", "${AnimeQ.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) + } +} From 1e981164ac397f21329a4cd5c8a9b8efd6de650a Mon Sep 17 00:00:00 2001 From: WebDitto Date: Sat, 29 Jun 2024 16:45:13 -0300 Subject: [PATCH 2/3] feat(pt/animeszone): Added support to Url Activity to pt/AnimesZone --- src/pt/animeszone/AndroidManifest.xml | 23 ++++++++++ src/pt/animeszone/build.gradle | 2 +- .../pt/animeszone/AZUrlActivity.kt | 42 +++++++++++++++++++ .../pt/animeszone/AnimesZone.kt | 23 ++++++++++ 4 files changed, 89 insertions(+), 1 deletion(-) create mode 100644 src/pt/animeszone/AndroidManifest.xml create mode 100644 src/pt/animeszone/src/eu/kanade/tachiyomi/animeextension/pt/animeszone/AZUrlActivity.kt diff --git a/src/pt/animeszone/AndroidManifest.xml b/src/pt/animeszone/AndroidManifest.xml new file mode 100644 index 00000000..bc031e78 --- /dev/null +++ b/src/pt/animeszone/AndroidManifest.xml @@ -0,0 +1,23 @@ + + + + + + + + + + + + + + + + diff --git a/src/pt/animeszone/build.gradle b/src/pt/animeszone/build.gradle index 1059e27d..6b089449 100644 --- a/src/pt/animeszone/build.gradle +++ b/src/pt/animeszone/build.gradle @@ -1,7 +1,7 @@ ext { extName = 'AnimesZone' extClass = '.AnimesZone' - extVersionCode = 7 + extVersionCode = 8 isNsfw = true } diff --git a/src/pt/animeszone/src/eu/kanade/tachiyomi/animeextension/pt/animeszone/AZUrlActivity.kt b/src/pt/animeszone/src/eu/kanade/tachiyomi/animeextension/pt/animeszone/AZUrlActivity.kt new file mode 100644 index 00000000..e701aadf --- /dev/null +++ b/src/pt/animeszone/src/eu/kanade/tachiyomi/animeextension/pt/animeszone/AZUrlActivity.kt @@ -0,0 +1,42 @@ +package eu.kanade.tachiyomi.animeextension.pt.animeszone + +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://animeszone.net// intents + * and redirects them to the main Aniyomi process. + */ +class AZUrlActivity : Activity() { + + private val tag = javaClass.simpleName + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + val pathSegments = intent?.data?.pathSegments + if (pathSegments != null && pathSegments.size > 1) { + val searchQuery = "${pathSegments[0]}/${pathSegments[1]}" + + val mainIntent = Intent().apply { + action = "eu.kanade.tachiyomi.ANIMESEARCH" + putExtra("query", "${AnimesZone.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/animeszone/src/eu/kanade/tachiyomi/animeextension/pt/animeszone/AnimesZone.kt b/src/pt/animeszone/src/eu/kanade/tachiyomi/animeextension/pt/animeszone/AnimesZone.kt index 2b8eac78..04f40496 100644 --- a/src/pt/animeszone/src/eu/kanade/tachiyomi/animeextension/pt/animeszone/AnimesZone.kt +++ b/src/pt/animeszone/src/eu/kanade/tachiyomi/animeextension/pt/animeszone/AnimesZone.kt @@ -16,6 +16,7 @@ import eu.kanade.tachiyomi.animesource.online.ParsedAnimeHttpSource import eu.kanade.tachiyomi.lib.doodextractor.DoodExtractor import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.network.POST +import eu.kanade.tachiyomi.network.awaitSuccess import eu.kanade.tachiyomi.util.asJsoup import eu.kanade.tachiyomi.util.parseAs import kotlinx.serialization.Serializable @@ -86,6 +87,26 @@ class AnimesZone : ConfigurableAnimeSource, ParsedAnimeHttpSource() { } // =============================== Search =============================== + override suspend fun getSearchAnime(page: Int, query: String, filters: AnimeFilterList): AnimesPage { + return if (query.startsWith(PREFIX_SEARCH)) { + val path = query.removePrefix(PREFIX_SEARCH) + client.newCall(GET("$baseUrl/$path")) + .awaitSuccess() + .use(::searchAnimeByIdParse) + } else { + super.getSearchAnime(page, query, filters) + } + } + + private fun searchAnimeByIdParse(response: Response): AnimesPage { + val details = animeDetailsParse(response).apply { + setUrlWithoutDomain(response.request.url.toString()) + initialized = true + } + + return AnimesPage(listOf(details), false) + } + override fun searchAnimeRequest(page: Int, query: String, filters: AnimeFilterList): Request { val params = AnimesZoneFilters.getSearchParameters(filters) @@ -405,6 +426,8 @@ class AnimesZone : ConfigurableAnimeSource, ParsedAnimeHttpSource() { } companion object { + const val PREFIX_SEARCH = "id:" + private val EPISODE_REGEX by lazy { Regex("""Episódio ?\d+\.?\d* ?""") } private const val PREF_QUALITY_KEY = "preferred_quality" From 4fc8eff401694709a60aee4f7d3511bf82b458d5 Mon Sep 17 00:00:00 2001 From: WebDitto Date: Sat, 29 Jun 2024 17:03:57 -0300 Subject: [PATCH 3/3] feat(pt/anitube): Added support to Url Activity to pt/Anitube --- src/pt/anitube/AndroidManifest.xml | 27 ++++++++++++ src/pt/anitube/build.gradle | 2 +- .../animeextension/pt/anitube/Anitube.kt | 22 ++++++++++ .../pt/anitube/AnitubeUrlActivity.kt | 42 +++++++++++++++++++ 4 files changed, 92 insertions(+), 1 deletion(-) create mode 100644 src/pt/anitube/AndroidManifest.xml create mode 100644 src/pt/anitube/src/eu/kanade/tachiyomi/animeextension/pt/anitube/AnitubeUrlActivity.kt diff --git a/src/pt/anitube/AndroidManifest.xml b/src/pt/anitube/AndroidManifest.xml new file mode 100644 index 00000000..bd0b64c6 --- /dev/null +++ b/src/pt/anitube/AndroidManifest.xml @@ -0,0 +1,27 @@ + + + + + + + + + + + + + + + + + diff --git a/src/pt/anitube/build.gradle b/src/pt/anitube/build.gradle index 7c7bcafc..cb8f6056 100644 --- a/src/pt/anitube/build.gradle +++ b/src/pt/anitube/build.gradle @@ -1,7 +1,7 @@ ext { extName = 'Anitube' extClass = '.Anitube' - extVersionCode = 13 + extVersionCode = 14 } apply from: "$rootDir/common.gradle" diff --git a/src/pt/anitube/src/eu/kanade/tachiyomi/animeextension/pt/anitube/Anitube.kt b/src/pt/anitube/src/eu/kanade/tachiyomi/animeextension/pt/anitube/Anitube.kt index f64daf0f..644545f9 100644 --- a/src/pt/anitube/src/eu/kanade/tachiyomi/animeextension/pt/anitube/Anitube.kt +++ b/src/pt/anitube/src/eu/kanade/tachiyomi/animeextension/pt/anitube/Anitube.kt @@ -6,11 +6,13 @@ import androidx.preference.PreferenceScreen import eu.kanade.tachiyomi.animeextension.pt.anitube.extractors.AnitubeExtractor import eu.kanade.tachiyomi.animesource.ConfigurableAnimeSource import eu.kanade.tachiyomi.animesource.model.AnimeFilterList +import eu.kanade.tachiyomi.animesource.model.AnimesPage 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.network.awaitSuccess import eu.kanade.tachiyomi.util.asJsoup import okhttp3.Request import okhttp3.Response @@ -76,6 +78,25 @@ class Anitube : ConfigurableAnimeSource, ParsedAnimeHttpSource() { override fun latestUpdatesNextPageSelector() = popularAnimeNextPageSelector() // =============================== Search =============================== + override suspend fun getSearchAnime(page: Int, query: String, filters: AnimeFilterList): AnimesPage { + return if (query.startsWith(PREFIX_SEARCH)) { + val path = query.removePrefix(PREFIX_SEARCH) + client.newCall(GET("$baseUrl/$path")) + .awaitSuccess() + .use(::searchAnimeByIdParse) + } else { + super.getSearchAnime(page, query, filters) + } + } + + private fun searchAnimeByIdParse(response: Response): AnimesPage { + val details = animeDetailsParse(response).apply { + setUrlWithoutDomain(response.request.url.toString()) + initialized = true + } + + return AnimesPage(listOf(details), false) + } override fun getFilterList(): AnimeFilterList = AnitubeFilters.FILTER_LIST override fun searchAnimeRequest(page: Int, query: String, filters: AnimeFilterList): Request { @@ -224,6 +245,7 @@ class Anitube : ConfigurableAnimeSource, ParsedAnimeHttpSource() { } companion object { + const val PREFIX_SEARCH = "id:" private val DATE_FORMATTER by lazy { SimpleDateFormat("dd/MM/yyyy", Locale.ENGLISH) } private const val ACCEPT_LANGUAGE = "pt-BR,pt;q=0.9,en-US;q=0.8,en;q=0.7" diff --git a/src/pt/anitube/src/eu/kanade/tachiyomi/animeextension/pt/anitube/AnitubeUrlActivity.kt b/src/pt/anitube/src/eu/kanade/tachiyomi/animeextension/pt/anitube/AnitubeUrlActivity.kt new file mode 100644 index 00000000..267dcde4 --- /dev/null +++ b/src/pt/anitube/src/eu/kanade/tachiyomi/animeextension/pt/anitube/AnitubeUrlActivity.kt @@ -0,0 +1,42 @@ +package eu.kanade.tachiyomi.animeextension.pt.anitube + +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://anitube.vip// intents + * and redirects them to the main Aniyomi process. + */ +class AnitubeUrlActivity : Activity() { + + private val tag = javaClass.simpleName + + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + val pathSegments = intent?.data?.pathSegments + if (pathSegments != null && pathSegments.size > 1) { + val searchQuery = "${pathSegments[0]}/${pathSegments[1]}" + + val mainIntent = Intent().apply { + action = "eu.kanade.tachiyomi.ANIMESEARCH" + putExtra("query", "${Anitube.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) + } +}