diff --git a/src/en/vizshonenjump/AndroidManifest.xml b/src/en/vizshonenjump/AndroidManifest.xml
index 30deb7f79..604e24eba 100644
--- a/src/en/vizshonenjump/AndroidManifest.xml
+++ b/src/en/vizshonenjump/AndroidManifest.xml
@@ -1,2 +1,25 @@
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/src/en/vizshonenjump/build.gradle b/src/en/vizshonenjump/build.gradle
index b53130ba7..791646ebd 100644
--- a/src/en/vizshonenjump/build.gradle
+++ b/src/en/vizshonenjump/build.gradle
@@ -6,7 +6,7 @@ ext {
extName = 'VIZ Shonen Jump'
pkgNameSuffix = 'en.vizshonenjump'
extClass = '.VizShonenJump'
- extVersionCode = 17
+ extVersionCode = 18
}
dependencies {
diff --git a/src/en/vizshonenjump/src/eu/kanade/tachiyomi/extension/en/vizshonenjump/VizShonenJump.kt b/src/en/vizshonenjump/src/eu/kanade/tachiyomi/extension/en/vizshonenjump/VizShonenJump.kt
index bcd9a60c2..110aef2f9 100644
--- a/src/en/vizshonenjump/src/eu/kanade/tachiyomi/extension/en/vizshonenjump/VizShonenJump.kt
+++ b/src/en/vizshonenjump/src/eu/kanade/tachiyomi/extension/en/vizshonenjump/VizShonenJump.kt
@@ -114,6 +114,15 @@ class VizShonenJump : ParsedHttpSource() {
override fun latestUpdatesNextPageSelector(): String? = null
override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable {
+ if (query.startsWith(PREFIX_URL_SEARCH)) {
+ return fetchMangaDetails(
+ SManga.create().apply {
+ this.url = query.substringAfter(PREFIX_URL_SEARCH)
+ this.title = ""
+ this.initialized = false
+ },
+ ).map { MangasPage(listOf(it), false) }
+ }
return super.fetchSearchManga(page, query, filters)
.map {
val filteredMangas = it.mangas.filter { m -> m.title.contains(query, true) }
@@ -159,7 +168,17 @@ class VizShonenJump : ParsedHttpSource() {
artist = author
status = SManga.ONGOING
description = seriesIntro.select("div.line-solid").firstOrNull()?.text()
- thumbnail_url = mangaFromList?.thumbnail_url ?: ""
+ thumbnail_url = if (!mangaFromList?.thumbnail_url.isNullOrEmpty()) {
+ mangaFromList!!.thumbnail_url // Can't be null in this branch
+ } else {
+ document.selectFirst("section.section_chapters td a > img")?.attr("data-original") ?: ""
+ }
+ url = mangaUrl
+ title = if (!mangaFromList?.title.isNullOrEmpty()) {
+ mangaFromList!!.title // Can't be null in this branch
+ } else {
+ seriesIntro.selectFirst("h2.type-lg")?.text() ?: ""
+ }
}
}
@@ -342,5 +361,7 @@ class VizShonenJump : ParsedHttpSource() {
private const val REFRESH_LOGIN_LINKS_URL = "account/refresh_login_links"
private const val MANGA_AUTH_CHECK_URL = "manga/auth"
+
+ const val PREFIX_URL_SEARCH = "url:"
}
}
diff --git a/src/en/vizshonenjump/src/eu/kanade/tachiyomi/extension/en/vizshonenjump/VizUrlActivity.kt b/src/en/vizshonenjump/src/eu/kanade/tachiyomi/extension/en/vizshonenjump/VizUrlActivity.kt
new file mode 100644
index 000000000..b4fa4b7d2
--- /dev/null
+++ b/src/en/vizshonenjump/src/eu/kanade/tachiyomi/extension/en/vizshonenjump/VizUrlActivity.kt
@@ -0,0 +1,75 @@
+package eu.kanade.tachiyomi.extension.en.vizshonenjump
+
+import android.app.Activity
+import android.content.ActivityNotFoundException
+import android.content.Intent
+import android.os.Bundle
+import android.util.Log
+import kotlin.system.exitProcess
+
+class VizUrlActivity : Activity() {
+ override fun onCreate(savedInstanceState: Bundle?) {
+ super.onCreate(savedInstanceState)
+ val pathSegments: List? = intent?.data?.pathSegments
+ if (!pathSegments.isNullOrEmpty() && pathSegments.size >= 3) {
+ // Have to use .equals, otherwise get an error 'Didn't find class "kotlin.jvm.internal.Intrinsics"'
+ val seriesSlug = if (pathSegments[2].equals("chapter") && contains(pathSegments[1], "-chapter-")) {
+ substringBeforeLast(pathSegments[1], "-chapter-")
+ } else {
+ pathSegments[2]
+ }
+ val mainIntent = Intent().apply {
+ action = "eu.kanade.tachiyomi.SEARCH"
+ putExtra(
+ "query",
+ "${VizShonenJump.PREFIX_URL_SEARCH}/${pathSegments[0]}/chapters/$seriesSlug",
+ )
+ putExtra("filter", packageName)
+ }
+
+ try {
+ startActivity(mainIntent)
+ } catch (e: ActivityNotFoundException) {
+ Log.e("VizUrlActivity", "failed to start activity with error: $e")
+ }
+ } else {
+ Log.e("VizUrlActivity", "could not parse uri from intent $intent")
+ }
+
+ finish()
+ exitProcess(0)
+ }
+
+ private fun containsAt(haystack: String, startIndex: Int, needle: String): Boolean {
+ for (i in 0 until needle.length) {
+ if (needle[i] != haystack[startIndex + i]) {
+ return false
+ }
+ }
+ return true
+ }
+
+ private fun contains(haystack: String, needle: String): Boolean {
+ if (needle.length > haystack.length) {
+ return false
+ }
+ for (startIndex in 0..haystack.length - needle.length) {
+ if (containsAt(haystack, startIndex, needle)) {
+ return true
+ }
+ }
+ return false
+ }
+
+ private fun substringBeforeLast(haystack: String, needle: String): String {
+ if (needle.length > haystack.length) {
+ return haystack
+ }
+ for (startIndex in (haystack.length - needle.length) downTo 0) {
+ if (containsAt(haystack, startIndex, needle)) {
+ return haystack.subSequence(0, startIndex).toString()
+ }
+ }
+ return haystack
+ }
+}