Add deeplink to LM (#19229)

Add deeplink to LM.
This commit is contained in:
Alessandro Jean 2023-12-08 15:20:44 -03:00 committed by GitHub
parent 4319c876a1
commit 3eb7ad4409
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 94 additions and 11 deletions

View File

@ -1,2 +1,22 @@
<?xml version="1.0" encoding="utf-8"?> <?xml version="1.0" encoding="utf-8"?>
<manifest /> <manifest xmlns:android="http://schemas.android.com/apk/res/android">
<application>
<activity
android:name=".pt.lermanga.LerMangaUrlActivity"
android:excludeFromRecents="true"
android:exported="true"
android:theme="@android:style/Theme.NoDisplay">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:host="lermanga.org" />
<data android:scheme="https" />
<data android:pathPattern="/mangas/..*" />
</intent-filter>
</activity>
</application>
</manifest>

View File

@ -6,7 +6,7 @@ ext {
extName = 'Ler Mangá' extName = 'Ler Mangá'
pkgNameSuffix = 'pt.lermanga' pkgNameSuffix = 'pt.lermanga'
extClass = '.LerManga' extClass = '.LerManga'
extVersionCode = 2 extVersionCode = 3
isNsfw = true isNsfw = true
} }

View File

@ -4,6 +4,7 @@ import android.util.Base64
import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.network.interceptor.rateLimit import eu.kanade.tachiyomi.network.interceptor.rateLimit
import eu.kanade.tachiyomi.source.model.FilterList import eu.kanade.tachiyomi.source.model.FilterList
import eu.kanade.tachiyomi.source.model.MangasPage
import eu.kanade.tachiyomi.source.model.Page import eu.kanade.tachiyomi.source.model.Page
import eu.kanade.tachiyomi.source.model.SChapter import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga import eu.kanade.tachiyomi.source.model.SManga
@ -11,12 +12,13 @@ import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import kotlinx.serialization.decodeFromString import kotlinx.serialization.decodeFromString
import kotlinx.serialization.json.Json import kotlinx.serialization.json.Json
import okhttp3.Headers import okhttp3.Headers
import okhttp3.HttpUrl.Companion.toHttpUrl
import okhttp3.OkHttpClient import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
import okhttp3.Response
import org.jsoup.nodes.Document import org.jsoup.nodes.Document
import org.jsoup.nodes.Element import org.jsoup.nodes.Element
import uy.kohesive.injekt.injectLazy import uy.kohesive.injekt.injectLazy
import java.lang.UnsupportedOperationException
import java.text.SimpleDateFormat import java.text.SimpleDateFormat
import java.util.Locale import java.util.Locale
import java.util.concurrent.TimeUnit import java.util.concurrent.TimeUnit
@ -68,19 +70,27 @@ class LerManga : ParsedHttpSource() {
override fun latestUpdatesNextPageSelector(): String? = null override fun latestUpdatesNextPageSelector(): String? = null
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request { override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
val path = if (page > 1) "page/$page/" else "" if (!query.startsWith(PREFIX_SLUG_SEARCH)) {
val url = "$baseUrl/$path".toHttpUrl().newBuilder() throw Exception(ERROR_NO_SEARCH_AVAILABLE)
.addQueryParameter("s", query) }
.build()
return GET(url, headers) val slug = query.removePrefix(PREFIX_SLUG_SEARCH)
val tempManga = SManga.create().apply { url = "/mangas/$slug" }
return mangaDetailsRequest(tempManga)
} }
override fun searchMangaSelector() = popularMangaSelector() override fun searchMangaParse(response: Response): MangasPage {
val manga = mangaDetailsParse(response)
override fun searchMangaFromElement(element: Element) = popularMangaFromElement(element) return MangasPage(listOf(manga), hasNextPage = false)
}
override fun searchMangaNextPageSelector() = popularMangaNextPageSelector() override fun searchMangaSelector() = throw UnsupportedOperationException("Not used")
override fun searchMangaFromElement(element: Element) = throw UnsupportedOperationException("Not used")
override fun searchMangaNextPageSelector() = throw UnsupportedOperationException("Not used")
override fun mangaDetailsParse(document: Document): SManga = SManga.create().apply { override fun mangaDetailsParse(document: Document): SManga = SManga.create().apply {
val infoElement = document.selectFirst("div.capitulo_recente")!! val infoElement = document.selectFirst("div.capitulo_recente")!!
@ -90,6 +100,7 @@ class LerManga : ParsedHttpSource() {
.joinToString { it.text() } .joinToString { it.text() }
description = infoElement.selectFirst("div.boxAnimeSobreLast p:last-child")!!.ownText() description = infoElement.selectFirst("div.boxAnimeSobreLast p:last-child")!!.ownText()
thumbnail_url = infoElement.selectFirst("div.capaMangaInfo img")!!.absUrl("src") thumbnail_url = infoElement.selectFirst("div.capaMangaInfo img")!!.absUrl("src")
setUrlWithoutDomain(document.location())
} }
override fun chapterListSelector() = "div.manga-chapters div.single-chapter" override fun chapterListSelector() = "div.manga-chapters div.single-chapter"
@ -147,5 +158,8 @@ class LerManga : ParsedHttpSource() {
private val DATE_FORMATTER by lazy { private val DATE_FORMATTER by lazy {
SimpleDateFormat("dd-MM-yyyy", Locale("pt", "BR")) SimpleDateFormat("dd-MM-yyyy", Locale("pt", "BR"))
} }
const val PREFIX_SLUG_SEARCH = "slug:"
private const val ERROR_NO_SEARCH_AVAILABLE = "O site não possui busca própria."
} }
} }

View File

@ -0,0 +1,49 @@
package eu.kanade.tachiyomi.extension.pt.lermanga
import android.app.Activity
import android.content.ActivityNotFoundException
import android.content.Intent
import android.os.Bundle
import android.util.Log
import kotlin.system.exitProcess
/**
* Activity that accepts https://lermanga.org/mangas/xxx intents and redirects them to
* the main Tachiyomi process. The idea is to not install the intent filter unless
* you have this extension installed, but still let the main Tachiyomi app control
* things.
*
* Main goal was to make it easier to open manga in Tachiyomi in spite of the DDoS blocking
* the usual search screen from working.
*
* Added as the site removed their own search and are using an embedded Google search.
* As Google has a lot of measures to prevent scrapping, this is the best that can
* be done at the moment.
*/
class LerMangaUrlActivity : Activity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val pathSegments = intent?.data?.pathSegments
if (pathSegments != null && pathSegments.size > 1) {
val slug = pathSegments[1]
val intent = Intent().apply {
action = "eu.kanade.tachiyomi.SEARCH"
putExtra("query", LerManga.PREFIX_SLUG_SEARCH + slug)
putExtra("filter", packageName)
}
try {
startActivity(intent)
} catch (e: ActivityNotFoundException) {
Log.e("LerMangaUrlActivity", e.toString())
}
} else {
Log.e("LerMangaUrlActivity", "Could not parse URI from intent $intent")
}
finish()
exitProcess(0)
}
}