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")