[VizShonenJump] Add URL intent for series and chapter links (#16398)

VizShonenJump: Open links in extension
This commit is contained in:
lord-ne 2023-05-11 09:59:00 -04:00 committed by GitHub
parent ca87da67a3
commit ce08808666
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 122 additions and 3 deletions

View File

@ -1,2 +1,25 @@
<?xml version="1.0" encoding="utf-8"?>
<manifest package="eu.kanade.tachiyomi.extension" />
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="eu.kanade.tachiyomi.extension">
<application>
<activity
android:name=".en.vizshonenjump.VizUrlActivity"
android:excludeFromRecents="true"
android:exported="true"
android:theme="@android:style/Theme.NoDisplay">
<intent-filter android:autoVerify="true">
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:host="www.viz.com" />
<data android:scheme="https" />
<data android:pathPattern="/..*/chapters/..*" />
<data android:pathPattern="/..*/..*/chapter/..*" />
</intent-filter>
</activity>
</application>
</manifest>

View File

@ -6,7 +6,7 @@ ext {
extName = 'VIZ Shonen Jump'
pkgNameSuffix = 'en.vizshonenjump'
extClass = '.VizShonenJump'
extVersionCode = 17
extVersionCode = 18
}
dependencies {

View File

@ -114,6 +114,15 @@ class VizShonenJump : ParsedHttpSource() {
override fun latestUpdatesNextPageSelector(): String? = null
override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable<MangasPage> {
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:"
}
}

View File

@ -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<String>? = 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
}
}