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 + } +}