From ddc9d8b10ac89a01b23589713dddaac680ec778d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Edgar=20Mej=C3=ADa?= Date: Thu, 27 Aug 2020 01:20:30 -0600 Subject: [PATCH] Fix Plot Twist no Fansub, Update LectorManga, TMOHentai and TMO (#4110) * Fix Latest url * Fix Kumanga error 400 bad request * Add support to opening links from the website in main app * TMO: Add support to opening links from the website in main app * TMOHentai: Add support to opening links from the website in main app * Revert "Fix Kumanga error 400 bad request" * Complete Kumanga revert. * Fix plot twist latest again * Update LetorManga gradle --- .../tachiyomi/extension/es/kumanga/Kumanga.kt | 2 +- src/es/lectormanga/AndroidManifest.xml | 19 +++++++++ src/es/lectormanga/build.gradle | 2 +- .../extension/es/lectormanga/LectorManga.kt | 29 +++++++++++++ .../es/lectormanga/LectorMangaUrlActivity.kt | 39 +++++++++++++++++ src/es/plottwistnofansub/build.gradle | 2 +- .../es/plottwistnofansub/PlotTwistNoFansub.kt | 2 +- src/es/tmohentai/AndroidManifest.xml | 19 +++++++++ src/es/tmohentai/build.gradle | 2 +- .../extension/es/tmohentai/TMOHentai.kt | 29 +++++++++++++ .../es/tmohentai/TMOHentaiUrlActivity.kt | 40 ++++++++++++++++++ src/es/tumangaonline/AndroidManifest.xml | 19 +++++++++ src/es/tumangaonline/build.gradle | 2 +- .../es/tumangaonline/TuMangaOnline.kt | 29 +++++++++++++ .../tumangaonline/TuMangaOnlineUrlActivity.kt | 42 +++++++++++++++++++ 15 files changed, 271 insertions(+), 6 deletions(-) create mode 100644 src/es/lectormanga/AndroidManifest.xml create mode 100644 src/es/lectormanga/src/eu/kanade/tachiyomi/extension/es/lectormanga/LectorMangaUrlActivity.kt create mode 100644 src/es/tmohentai/AndroidManifest.xml create mode 100644 src/es/tmohentai/src/eu/kanade/tachiyomi/extension/es/tmohentai/TMOHentaiUrlActivity.kt create mode 100644 src/es/tumangaonline/AndroidManifest.xml create mode 100644 src/es/tumangaonline/src/eu/kanade/tachiyomi/extension/es/tumangaonline/TuMangaOnlineUrlActivity.kt diff --git a/src/es/kumanga/src/eu/kanade/tachiyomi/extension/es/kumanga/Kumanga.kt b/src/es/kumanga/src/eu/kanade/tachiyomi/extension/es/kumanga/Kumanga.kt index 5b2240a78..081da2e39 100755 --- a/src/es/kumanga/src/eu/kanade/tachiyomi/extension/es/kumanga/Kumanga.kt +++ b/src/es/kumanga/src/eu/kanade/tachiyomi/extension/es/kumanga/Kumanga.kt @@ -142,7 +142,7 @@ class Kumanga : HttpSource() { name = it.text() date_upload = parseChapterDate(it.attr("title")) } - scanlator = element.select("span.pull-right.greenSpan")?.text() + scanlator = element.select("span.pull-right.greenSpan")?.text() } override fun chapterListParse(response: Response): List = mutableListOf().apply { diff --git a/src/es/lectormanga/AndroidManifest.xml b/src/es/lectormanga/AndroidManifest.xml new file mode 100644 index 000000000..c7a398abb --- /dev/null +++ b/src/es/lectormanga/AndroidManifest.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + diff --git a/src/es/lectormanga/build.gradle b/src/es/lectormanga/build.gradle index a7acf1568..81380f585 100755 --- a/src/es/lectormanga/build.gradle +++ b/src/es/lectormanga/build.gradle @@ -5,7 +5,7 @@ ext { extName = 'LectorManga' pkgNameSuffix = 'es.lectormanga' extClass = '.LectorManga' - extVersionCode = 13 + extVersionCode = 14 libVersion = '1.2' } diff --git a/src/es/lectormanga/src/eu/kanade/tachiyomi/extension/es/lectormanga/LectorManga.kt b/src/es/lectormanga/src/eu/kanade/tachiyomi/extension/es/lectormanga/LectorManga.kt index 380564018..1a4275bc2 100755 --- a/src/es/lectormanga/src/eu/kanade/tachiyomi/extension/es/lectormanga/LectorManga.kt +++ b/src/es/lectormanga/src/eu/kanade/tachiyomi/extension/es/lectormanga/LectorManga.kt @@ -5,9 +5,11 @@ import android.content.SharedPreferences import android.support.v7.preference.ListPreference import android.support.v7.preference.PreferenceScreen import eu.kanade.tachiyomi.network.GET +import eu.kanade.tachiyomi.network.asObservableSuccess import eu.kanade.tachiyomi.source.ConfigurableSource import eu.kanade.tachiyomi.source.model.Filter 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.SChapter import eu.kanade.tachiyomi.source.model.SManga @@ -21,6 +23,7 @@ import okhttp3.Request import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import rx.Observable import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get @@ -137,6 +140,7 @@ class LectorManga : ConfigurableSource, ParsedHttpSource() { override fun searchMangaFromElement(element: Element): SManga = popularMangaFromElement(element) override fun mangaDetailsParse(document: Document) = SManga.create().apply { + title = document.select("h1:has(small)").text() genre = document.select("a.py-2").joinToString(", ") { it.text() } @@ -239,6 +243,28 @@ class LectorManga : ConfigurableSource, ParsedHttpSource() { override fun imageUrlParse(document: Document): String = document.select("img.viewer-image").attr("src") + private fun searchMangaByIdRequest(id: String) = GET("$baseUrl/$MANGA_URL_CHUNK/$id", headers) + + override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable { + return if (query.startsWith(PREFIX_ID_SEARCH)) { + val realQuery = query.removePrefix(PREFIX_ID_SEARCH) + + client.newCall(searchMangaByIdRequest(realQuery)) + .asObservableSuccess() + .map { response -> + val details = mangaDetailsParse(response) + details.url = "/$MANGA_URL_CHUNK/$realQuery" + MangasPage(listOf(details), false) + } + } else { + client.newCall(searchMangaRequest(page, query, filters)) + .asObservableSuccess() + .map { response -> + searchMangaParse(response) + } + } + } + private class Types : UriPartFilter("Filtrar por tipo", arrayOf( Pair("Ver todos", ""), Pair("Manga", "manga"), @@ -443,6 +469,9 @@ class LectorManga : ConfigurableSource, ParsedHttpSource() { private const val PAGEGET_PREF_Title = "Método para la descarga de imágenes" private const val PAGEGET_PREF = "pagemethodpref" + const val PREFIX_ID_SEARCH = "id:" + const val MANGA_URL_CHUNK = "gotobook" + private val SORTABLES = listOf( Pair("Me gusta", "likes_count"), Pair("Alfabético", "alphabetically"), diff --git a/src/es/lectormanga/src/eu/kanade/tachiyomi/extension/es/lectormanga/LectorMangaUrlActivity.kt b/src/es/lectormanga/src/eu/kanade/tachiyomi/extension/es/lectormanga/LectorMangaUrlActivity.kt new file mode 100644 index 000000000..3cad95e69 --- /dev/null +++ b/src/es/lectormanga/src/eu/kanade/tachiyomi/extension/es/lectormanga/LectorMangaUrlActivity.kt @@ -0,0 +1,39 @@ +package eu.kanade.tachiyomi.extension.es.lectormanga + +import android.app.Activity +import android.content.ActivityNotFoundException +import android.content.Intent +import android.os.Bundle +import android.util.Log +import kotlin.system.exitProcess + +/** + * Springboard that accepts https://lectormanga.com/gotobook/:id intents and redirects them to + * the main Tachiyomi process. + */ +class LectorMangaUrlActivity : Activity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + val pathSegments = intent?.data?.pathSegments + + if (pathSegments != null && pathSegments.size > 1) { + val id = pathSegments[1] + val mainIntent = Intent().apply { + action = "eu.kanade.tachiyomi.SEARCH" + putExtra("query", "${LectorManga.PREFIX_ID_SEARCH}$id") + putExtra("filter", packageName) + } + + try { + startActivity(mainIntent) + } catch (e: ActivityNotFoundException) { + Log.e("LectorMangaUrlActivity", e.toString()) + } + } else { + Log.e("LectorMangaUrlActivity", "could not parse uri from intent $intent") + } + + finish() + exitProcess(0) + } +} diff --git a/src/es/plottwistnofansub/build.gradle b/src/es/plottwistnofansub/build.gradle index d926ff3a0..fabef680d 100644 --- a/src/es/plottwistnofansub/build.gradle +++ b/src/es/plottwistnofansub/build.gradle @@ -5,7 +5,7 @@ ext { extName = 'Plot Twist No Fansub' pkgNameSuffix = 'es.plottwistnofansub' extClass = '.PlotTwistNoFansub' - extVersionCode = 1 + extVersionCode = 2 libVersion = '1.2' } diff --git a/src/es/plottwistnofansub/src/eu/kanade/tachiyomi/extension/es/plottwistnofansub/PlotTwistNoFansub.kt b/src/es/plottwistnofansub/src/eu/kanade/tachiyomi/extension/es/plottwistnofansub/PlotTwistNoFansub.kt index 73849d83d..10b637ffe 100644 --- a/src/es/plottwistnofansub/src/eu/kanade/tachiyomi/extension/es/plottwistnofansub/PlotTwistNoFansub.kt +++ b/src/es/plottwistnofansub/src/eu/kanade/tachiyomi/extension/es/plottwistnofansub/PlotTwistNoFansub.kt @@ -48,7 +48,7 @@ class PlotTwistNoFansub : ParsedHttpSource() { override fun popularMangaNextPageSelector() = "div.page-nav a:has(i)" - override fun latestUpdatesRequest(page: Int) = GET("$baseUrl/ulti/", headers) + override fun latestUpdatesRequest(page: Int) = GET("$baseUrl/", headers) override fun latestUpdatesSelector() = "div.row.last-updates div.item" diff --git a/src/es/tmohentai/AndroidManifest.xml b/src/es/tmohentai/AndroidManifest.xml new file mode 100644 index 000000000..32c5f3e2e --- /dev/null +++ b/src/es/tmohentai/AndroidManifest.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + diff --git a/src/es/tmohentai/build.gradle b/src/es/tmohentai/build.gradle index 41286d305..9d21bebf4 100755 --- a/src/es/tmohentai/build.gradle +++ b/src/es/tmohentai/build.gradle @@ -5,7 +5,7 @@ ext { extName = 'TMOHentai' pkgNameSuffix = 'es.tmohentai' extClass = '.TMOHentai' - extVersionCode = 3 + extVersionCode = 4 libVersion = '1.2' containsNsfw = true } diff --git a/src/es/tmohentai/src/eu/kanade/tachiyomi/extension/es/tmohentai/TMOHentai.kt b/src/es/tmohentai/src/eu/kanade/tachiyomi/extension/es/tmohentai/TMOHentai.kt index e2a7f2e94..210f8ead9 100755 --- a/src/es/tmohentai/src/eu/kanade/tachiyomi/extension/es/tmohentai/TMOHentai.kt +++ b/src/es/tmohentai/src/eu/kanade/tachiyomi/extension/es/tmohentai/TMOHentai.kt @@ -2,8 +2,10 @@ package eu.kanade.tachiyomi.extension.es.tmohentai import eu.kanade.tachiyomi.annotations.Nsfw import eu.kanade.tachiyomi.network.GET +import eu.kanade.tachiyomi.network.asObservableSuccess import eu.kanade.tachiyomi.source.model.Filter 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.SChapter import eu.kanade.tachiyomi.source.model.SManga @@ -12,6 +14,7 @@ import okhttp3.HttpUrl import okhttp3.Request import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import rx.Observable @Nsfw class TMOHentai : ParsedHttpSource() { @@ -50,6 +53,7 @@ class TMOHentai : ParsedHttpSource() { val parsedInformation = document.select("div.row > div.panel.panel-primary").text() val authorAndArtist = parsedInformation.substringAfter("Groups").substringBefore("Magazines").trim() + title = document.select("h3.truncate").text() thumbnail_url = document.select("img.content-thumbnail-cover").attr("src") author = authorAndArtist artist = authorAndArtist @@ -121,6 +125,28 @@ class TMOHentai : ParsedHttpSource() { override fun searchMangaNextPageSelector() = popularMangaNextPageSelector() + private fun searchMangaByIdRequest(id: String) = GET("$baseUrl/$PREFIX_CONTENTS/$id", headers) + + override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable { + return if (query.startsWith(PREFIX_ID_SEARCH)) { + val realQuery = query.removePrefix(PREFIX_ID_SEARCH) + + client.newCall(searchMangaByIdRequest(realQuery)) + .asObservableSuccess() + .map { response -> + val details = mangaDetailsParse(response) + details.url = "/$PREFIX_CONTENTS/$realQuery" + MangasPage(listOf(details), false) + } + } else { + client.newCall(searchMangaRequest(page, query, filters)) + .asObservableSuccess() + .map { response -> + searchMangaParse(response) + } + } + } + private class Genre(name: String, val id: String) : Filter.CheckBox(name) private class GenreList(genres: List) : Filter.Group("Géneros", genres) @@ -214,6 +240,9 @@ class TMOHentai : ParsedHttpSource() { ) companion object { + const val PREFIX_CONTENTS = "contents" + const val PREFIX_ID_SEARCH = "id:" + private val SORTABLES = listOf( Pair("Alfabético", "alphabetic"), Pair("Creación", "publication_date"), diff --git a/src/es/tmohentai/src/eu/kanade/tachiyomi/extension/es/tmohentai/TMOHentaiUrlActivity.kt b/src/es/tmohentai/src/eu/kanade/tachiyomi/extension/es/tmohentai/TMOHentaiUrlActivity.kt new file mode 100644 index 000000000..a1488f8a7 --- /dev/null +++ b/src/es/tmohentai/src/eu/kanade/tachiyomi/extension/es/tmohentai/TMOHentaiUrlActivity.kt @@ -0,0 +1,40 @@ +package eu.kanade.tachiyomi.extension.es.tmohentai + +import android.app.Activity +import android.content.ActivityNotFoundException +import android.content.Intent +import android.os.Bundle +import android.util.Log +import kotlin.system.exitProcess + +/** + * Springboard that accepts https://tmohentai.com/contents/:id intents and redirects them to + * the main Tachiyomi process. + */ +class TMOHentaiUrlActivity : Activity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + val pathSegments = intent?.data?.pathSegments + + if (pathSegments != null && pathSegments.size > 1) { + val id = pathSegments[1] + + val mainIntent = Intent().apply { + action = "eu.kanade.tachiyomi.SEARCH" + putExtra("query", "${TMOHentai.PREFIX_ID_SEARCH}$id") + putExtra("filter", packageName) + } + + try { + startActivity(mainIntent) + } catch (e: ActivityNotFoundException) { + Log.e("TMOHentaiUrlActivity", e.toString()) + } + } else { + Log.e("TMOHentaiUrlActivity", "could not parse uri from intent $intent") + } + + finish() + exitProcess(0) + } +} diff --git a/src/es/tumangaonline/AndroidManifest.xml b/src/es/tumangaonline/AndroidManifest.xml new file mode 100644 index 000000000..6a476d7ab --- /dev/null +++ b/src/es/tumangaonline/AndroidManifest.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + diff --git a/src/es/tumangaonline/build.gradle b/src/es/tumangaonline/build.gradle index 188c5b42a..d42ae1e86 100644 --- a/src/es/tumangaonline/build.gradle +++ b/src/es/tumangaonline/build.gradle @@ -5,7 +5,7 @@ ext { extName = 'TuMangaOnline' pkgNameSuffix = 'es.tumangaonline' extClass = '.TuMangaOnline' - extVersionCode = 28 + extVersionCode = 29 libVersion = '1.2' } diff --git a/src/es/tumangaonline/src/eu/kanade/tachiyomi/extension/es/tumangaonline/TuMangaOnline.kt b/src/es/tumangaonline/src/eu/kanade/tachiyomi/extension/es/tumangaonline/TuMangaOnline.kt index e3c5c8db3..f22070d47 100644 --- a/src/es/tumangaonline/src/eu/kanade/tachiyomi/extension/es/tumangaonline/TuMangaOnline.kt +++ b/src/es/tumangaonline/src/eu/kanade/tachiyomi/extension/es/tumangaonline/TuMangaOnline.kt @@ -5,9 +5,11 @@ import android.content.SharedPreferences import android.support.v7.preference.ListPreference import android.support.v7.preference.PreferenceScreen import eu.kanade.tachiyomi.network.GET +import eu.kanade.tachiyomi.network.asObservableSuccess import eu.kanade.tachiyomi.source.ConfigurableSource import eu.kanade.tachiyomi.source.model.Filter 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.SChapter import eu.kanade.tachiyomi.source.model.SManga @@ -21,6 +23,7 @@ import okhttp3.Request import okhttp3.Response import org.jsoup.nodes.Document import org.jsoup.nodes.Element +import rx.Observable import uy.kohesive.injekt.Injekt import uy.kohesive.injekt.api.get @@ -138,6 +141,7 @@ class TuMangaOnline : ConfigurableSource, ParsedHttpSource() { override fun searchMangaFromElement(element: Element): SManga = popularMangaFromElement(element) override fun mangaDetailsParse(document: Document) = SManga.create().apply { + title = document.select("h2.element-subtitle").text() document.select("h5.card-title").let { author = it?.first()?.attr("title")?.substringAfter(", ") artist = it?.last()?.attr("title")?.substringAfter(", ") @@ -251,6 +255,28 @@ class TuMangaOnline : ConfigurableSource, ParsedHttpSource() { return document.select("div.viewer-container > div.img-container > img.viewer-image").attr("src") } + private fun searchMangaByIdRequest(id: String) = GET("$baseUrl/$PREFIX_LIBRARY/$id", headers) + + override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable { + return if (query.startsWith(PREFIX_ID_SEARCH)) { + val realQuery = query.removePrefix(PREFIX_ID_SEARCH) + + client.newCall(searchMangaByIdRequest(realQuery)) + .asObservableSuccess() + .map { response -> + val details = mangaDetailsParse(response) + details.url = "/$PREFIX_LIBRARY/$realQuery" + MangasPage(listOf(details), false) + } + } else { + client.newCall(searchMangaRequest(page, query, filters)) + .asObservableSuccess() + .map { response -> + searchMangaParse(response) + } + } + } + private class Types : UriPartFilter("Filtrar por tipo", arrayOf( Pair("Ver todo", ""), Pair("Manga", "manga"), @@ -453,6 +479,9 @@ class TuMangaOnline : ConfigurableSource, ParsedHttpSource() { private const val PAGEGET_PREF_Title = "Método para la descarga de imágenes" private const val PAGEGET_PREF = "pagemethodpref" + const val PREFIX_LIBRARY = "library" + const val PREFIX_ID_SEARCH = "id:" + private val SORTABLES = listOf( Pair("Me gusta", "likes_count"), Pair("Alfabético", "alphabetically"), diff --git a/src/es/tumangaonline/src/eu/kanade/tachiyomi/extension/es/tumangaonline/TuMangaOnlineUrlActivity.kt b/src/es/tumangaonline/src/eu/kanade/tachiyomi/extension/es/tumangaonline/TuMangaOnlineUrlActivity.kt new file mode 100644 index 000000000..486ff7133 --- /dev/null +++ b/src/es/tumangaonline/src/eu/kanade/tachiyomi/extension/es/tumangaonline/TuMangaOnlineUrlActivity.kt @@ -0,0 +1,42 @@ +package eu.kanade.tachiyomi.extension.es.tumangaonline + +import android.app.Activity +import android.content.ActivityNotFoundException +import android.content.Intent +import android.os.Bundle +import android.util.Log +import kotlin.system.exitProcess + +/** + * Springboard that accepts https://lectortmo.com/library/:type/:id/:slug intents and redirects them to + * the main Tachiyomi process. + */ +class TuMangaOnlineUrlActivity : Activity() { + override fun onCreate(savedInstanceState: Bundle?) { + super.onCreate(savedInstanceState) + val pathSegments = intent?.data?.pathSegments + + if (pathSegments != null && pathSegments.size > 3) { + val type = pathSegments[1] + val id = pathSegments[2] + val slug = pathSegments[3] + + val mainIntent = Intent().apply { + action = "eu.kanade.tachiyomi.SEARCH" + putExtra("query", "${TuMangaOnline.PREFIX_ID_SEARCH}$type/$id/$slug") + putExtra("filter", packageName) + } + + try { + startActivity(mainIntent) + } catch (e: ActivityNotFoundException) { + Log.e("TMOUrlActivity", e.toString()) + } + } else { + Log.e("TMOUrlActivity", "could not parse uri from intent $intent") + } + + finish() + exitProcess(0) + } +}