From ea96bab86b13b10a47ca922c8ca9d849fe2ecf27 Mon Sep 17 00:00:00 2001
From: lord-ne <34069872+lord-ne@users.noreply.github.com>
Date: Mon, 20 Jun 2022 11:13:26 -0400
Subject: [PATCH] [Manga Plus] Add URL intent for chapter links (#12252)
* [Manga Plus] Add URL intent for chapter links
* Use a when block instead of nested if-else
* Add more descriptive error message
---
src/all/mangaplus/AndroidManifest.xml | 8 ++++++
src/all/mangaplus/build.gradle | 2 +-
.../extension/all/mangaplus/MangaPlus.kt | 27 +++++++++++++++++++
.../extension/all/mangaplus/MangaPlusDto.kt | 5 +++-
.../all/mangaplus/MangaPlusUrlActivity.kt | 13 +++++----
5 files changed, 48 insertions(+), 7 deletions(-)
diff --git a/src/all/mangaplus/AndroidManifest.xml b/src/all/mangaplus/AndroidManifest.xml
index 51dd67096..9e6a755f1 100644
--- a/src/all/mangaplus/AndroidManifest.xml
+++ b/src/all/mangaplus/AndroidManifest.xml
@@ -30,6 +30,14 @@
android:host="www.jumpg-webapi.tokyo-cdn.com"
android:path="/www/sns_share"
android:scheme="https" />
+
+
diff --git a/src/all/mangaplus/build.gradle b/src/all/mangaplus/build.gradle
index b378134e2..b495eaa2f 100644
--- a/src/all/mangaplus/build.gradle
+++ b/src/all/mangaplus/build.gradle
@@ -6,7 +6,7 @@ ext {
extName = 'MANGA Plus by SHUEISHA'
pkgNameSuffix = 'all.mangaplus'
extClass = '.MangaPlusFactory'
- extVersionCode = 33
+ extVersionCode = 34
}
apply from: "$rootDir/common.gradle"
diff --git a/src/all/mangaplus/src/eu/kanade/tachiyomi/extension/all/mangaplus/MangaPlus.kt b/src/all/mangaplus/src/eu/kanade/tachiyomi/extension/all/mangaplus/MangaPlus.kt
index 22a5d5691..1f5ea3bc5 100644
--- a/src/all/mangaplus/src/eu/kanade/tachiyomi/extension/all/mangaplus/MangaPlus.kt
+++ b/src/all/mangaplus/src/eu/kanade/tachiyomi/extension/all/mangaplus/MangaPlus.kt
@@ -139,7 +139,29 @@ abstract class MangaPlus(
return MangasPage(mangas, false)
}
+ private fun fetchTitleIdFromChapterId(chapterId: String): Observable {
+
+ return Observable.defer {
+ client.newCall(pageListRequestFromChapterId(chapterId)).asObservableSuccess()
+ }.map { response ->
+ titleIdParse(response)
+ }
+ }
+
+ private fun titleIdParse(response: Response): Int {
+ val result = response.asMangaPlusResponse()
+
+ checkNotNull(result.success) { result.error!!.langPopup(langCode).body }
+
+ return checkNotNull(result.success.mangaViewer?.titleId) { "Chapter is invalid or expired" }
+ }
+
override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable {
+ if (query.startsWith(PREFIX_CHAPTER_ID_SEARCH) && query.matches(CHAPTER_ID_SEARCH_PATTERN)) {
+ return fetchTitleIdFromChapterId(query.removePrefix(PREFIX_CHAPTER_ID_SEARCH)).flatMap {
+ fetchSearchManga(page, "$PREFIX_ID_SEARCH$it", filters)
+ }
+ }
return super.fetchSearchManga(page, query, filters)
.map {
if (it.mangas.size == 1) {
@@ -268,7 +290,10 @@ abstract class MangaPlus(
override fun pageListRequest(chapter: SChapter): Request {
val chapterId = chapter.url.substringAfterLast("/")
+ return pageListRequestFromChapterId(chapterId)
+ }
+ private fun pageListRequestFromChapterId(chapterId: String): Request {
val newHeaders = headersBuilder()
.set("Referer", "$baseUrl/viewer/$chapterId")
.build()
@@ -434,5 +459,7 @@ abstract class MangaPlus(
const val PREFIX_ID_SEARCH = "id:"
private val ID_SEARCH_PATTERN = "^id:(\\d+)$".toRegex()
+ const val PREFIX_CHAPTER_ID_SEARCH = "ch_id:"
+ private val CHAPTER_ID_SEARCH_PATTERN = "^ch_id:(\\d+)$".toRegex()
}
}
diff --git a/src/all/mangaplus/src/eu/kanade/tachiyomi/extension/all/mangaplus/MangaPlusDto.kt b/src/all/mangaplus/src/eu/kanade/tachiyomi/extension/all/mangaplus/MangaPlusDto.kt
index 30e896608..b6621618c 100644
--- a/src/all/mangaplus/src/eu/kanade/tachiyomi/extension/all/mangaplus/MangaPlusDto.kt
+++ b/src/all/mangaplus/src/eu/kanade/tachiyomi/extension/all/mangaplus/MangaPlusDto.kt
@@ -94,7 +94,10 @@ data class TitleDetailView(
}
@Serializable
-data class MangaViewer(val pages: List = emptyList())
+data class MangaViewer(
+ val pages: List = emptyList(),
+ val titleId: Int? = null
+)
@Serializable
data class Title(
diff --git a/src/all/mangaplus/src/eu/kanade/tachiyomi/extension/all/mangaplus/MangaPlusUrlActivity.kt b/src/all/mangaplus/src/eu/kanade/tachiyomi/extension/all/mangaplus/MangaPlusUrlActivity.kt
index 2d70c4a0a..2fa5b2d59 100644
--- a/src/all/mangaplus/src/eu/kanade/tachiyomi/extension/all/mangaplus/MangaPlusUrlActivity.kt
+++ b/src/all/mangaplus/src/eu/kanade/tachiyomi/extension/all/mangaplus/MangaPlusUrlActivity.kt
@@ -14,13 +14,16 @@ class MangaPlusUrlActivity : Activity() {
val pathSegments = intent?.data?.pathSegments
if (pathSegments != null && pathSegments.size > 1) {
- val titleId = if (!pathSegments[1].equals("sns_share")) pathSegments[1] else
- intent?.data?.getQueryParameter("title_id")
+ val query = when {
+ pathSegments[0].equals("viewer") -> MangaPlus.PREFIX_CHAPTER_ID_SEARCH + pathSegments[1]
+ pathSegments[0].equals("sns_share") -> intent?.data?.getQueryParameter("title_id")?.let { MangaPlus.PREFIX_ID_SEARCH + it }
+ else -> MangaPlus.PREFIX_ID_SEARCH + pathSegments[1]
+ }
- if (titleId != null) {
+ if (query != null) {
val mainIntent = Intent().apply {
action = "eu.kanade.tachiyomi.SEARCH"
- putExtra("query", MangaPlus.PREFIX_ID_SEARCH + titleId)
+ putExtra("query", query)
putExtra("filter", packageName)
}
@@ -30,7 +33,7 @@ class MangaPlusUrlActivity : Activity() {
Log.e("MangaPlusUrlActivity", e.toString())
}
} else {
- Log.e("MangaPlusUrlActivity", "Missing title ID from the URL")
+ Log.e("MangaPlusUrlActivity", "Missing title/chapter ID from the URL")
}
} else {
Log.e("MangaPlusUrlActivity", "Could not parse URI from intent $intent")