Manhwa latino (#13054)

* First commit Mahnwa-Latino Extension.

* manhwa-latino: Implementing find function

TODO: only works with text, filter not implemented yet

* manhwa-latino Add Parser to finde the information of Manhwa-Latino

The parser 'ManhwaLatinoSiteParser.kt' make the whole magic to find the
information of the Website.

Mudularize The code and adding documentation

* manhwa-latino: Adding Logos der Extension

TODO: I am not to happy, i will check it later.

* manhwa-latino: Adding Tags to Genre Combobox

* manhwa-latino: Adding Headers to prevent error 404

The headers are necesary to prevent error 403 by downloading images.

* manhwa-latino: Tags addded into Manga Description Page

Status from Manga readed from Tags

* manhwa-latino: Modularize Code

* manhwa-latino: Adding Uploaddate for Chapters

* manhwa-latino: Bug to get Chapter Number fixed

* manhwa-latino: Logo 0.2

* manhwa-latino: Versionb 1.2.10

Adding Comments to ManhwaLatinoSiteParser

* manhwa-latino: Remove logo_model directory

* manhwa-latino: Show Seconds after Release a new Chapter

* manhwa-latino: Fix for Cloudflare

* manhwa-latino: Try to fix Cloudflare ByPass

Adding isNsfw to build.gradle

* manhwa-latino: Update from parser after website update

* manhwa-latino: Deactivate lastest manga and new Client

The new website from Manhwa-Latino doesnt show lastest mangas.

* manhwa-latino: Adding Manifest to load url-adress

The extesion will bi able to open and find mangas with the url.
TODO: first version. NOT READY YET.

* manhwa-latino: Fix to find Manga Status information

* Manhwa-Latino: The Extension can open a Link

Now the extension can recognize a link from Manhwa-Latino and
show the manga from the link in the app.

* Manhwa-Latino: Modularize Code and Activity for Url added

* Manhwa-Latino: Add Constant-File.

This file contain all contants for this extension.

* manhwa-latino Url from the Website has changed.

from https://manhwa-latino.com => https://manhwa-es.com

* manhwa-latino Url update on manifest

* manhwa-latino Fix to get ThumbnailUrl and Url from Slider

The Slider from Manhwa-Latino was updated and the parser was updated as
well.

* manhwa-latino: Using Cloudflare Client to connect.

Manhwa-Latino now Manhwa-Es are using cloudflare right now.
This workaround fix make possible the connection from the app to the
Website.

* Update the address to every image

* Update Manhwa-Latino Address

* Updating popularMangaNextPageSelector

* Remove CLoudFlare Client

* Manhwa-Latino: Update Image Src-Tag

The website has changed the attribute where the adress to the images
are.

* Mahnwa-Latino: Remove client, because it is not overwritten

Original Client is:
	override val client: OkHttpClient = network.client.newBuilder().build()

it is not overwritten, that is why it can remove.

* manhwa-latino: Remove Comments

Co-authored-by: Luis Beroiza <luisalberto.beroizaosses@intern.osp-dd.de>
Co-authored-by: AlberyKous <extreme_rvd@hotmail.com>
This commit is contained in:
Luis Alberto 2022-08-19 13:37:02 +02:00 committed by GitHub
parent 0739496f50
commit a13b3ffce6
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
4 changed files with 48 additions and 25 deletions

View File

@ -5,7 +5,7 @@ ext {
extName = 'Manhwa-Latino' extName = 'Manhwa-Latino'
pkgNameSuffix = 'es.manhwalatino' pkgNameSuffix = 'es.manhwalatino'
extClass = '.ManhwaLatino' extClass = '.ManhwaLatino'
extVersionCode = 19 extVersionCode = 20
isNsfw = true isNsfw = true
} }

View File

@ -7,7 +7,7 @@ object MLConstants {
const val searchMangaNextPageSelector = "link[rel=next]" const val searchMangaNextPageSelector = "link[rel=next]"
const val latestUpdatesSelector = "div.slider__item" const val latestUpdatesSelector = "div.slider__item"
const val searchMangaSelector = "div.page-item-detail.manga" const val searchMangaSelector = "div.page-item-detail.manga"
const val popularMangaNextPageSelector = "nav.navigation-ajax" const val popularMangaNextPageSelector = "a.nextpostslink"
const val latestUpdatesNextPageSelector = "div[role=navigation] a.last" const val latestUpdatesNextPageSelector = "div[role=navigation] a.last"
const val popularMangaSelector = "div.page-item-detail.manga" const val popularMangaSelector = "div.page-item-detail.manga"
@ -36,4 +36,5 @@ object MLConstants {
const val chapterReleaseDateLinkParser = "span.chapter-release-date a" const val chapterReleaseDateLinkParser = "span.chapter-release-date a"
const val chapterReleaseDateIParser = "span.chapter-release-date i" const val chapterReleaseDateIParser = "span.chapter-release-date i"
const val pageListParseSelector = "div.page-break.no-gaps img" const val pageListParseSelector = "div.page-break.no-gaps img"
const val imageAttribute = "abs:data-src"
} }

View File

@ -11,13 +11,11 @@ import eu.kanade.tachiyomi.source.model.SManga
import eu.kanade.tachiyomi.source.online.ParsedHttpSource import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import eu.kanade.tachiyomi.util.asJsoup import eu.kanade.tachiyomi.util.asJsoup
import okhttp3.Headers import okhttp3.Headers
import okhttp3.OkHttpClient
import okhttp3.Request import okhttp3.Request
import okhttp3.Response import okhttp3.Response
import org.jsoup.nodes.Document import org.jsoup.nodes.Document
import org.jsoup.nodes.Element import org.jsoup.nodes.Element
import rx.Observable import rx.Observable
import java.util.concurrent.TimeUnit
class ManhwaLatino : ParsedHttpSource() { class ManhwaLatino : ParsedHttpSource() {
@ -37,14 +35,6 @@ class ManhwaLatino : ParsedHttpSource() {
*/ */
override fun headersBuilder() = Headers.Builder().add("Referer", "$baseUrl") override fun headersBuilder() = Headers.Builder().add("Referer", "$baseUrl")
/**
* Http Client with Cloudflare
*/
override val client: OkHttpClient = network.cloudflareClient.newBuilder()
.connectTimeout(10, TimeUnit.SECONDS)
.readTimeout(30, TimeUnit.SECONDS)
.build()
/** /**
* Parser for The WebSite * Parser for The WebSite
*/ */

View File

@ -75,9 +75,11 @@ class ManhwaLatinoSiteParser(
fun getMangaFromLastTranslatedSlide(element: Element): SManga { fun getMangaFromLastTranslatedSlide(element: Element): SManga {
val manga = SManga.create() val manga = SManga.create()
manga.url = manga.url =
getUrlWithoutDomain(element.select(MLConstants.latestUpdatesSelectorUrl).first().attr("abs:href")) getUrlWithoutDomain(
element.select(MLConstants.latestUpdatesSelectorUrl).first().attr("abs:href")
)
manga.title = element.select(MLConstants.latestUpdatesSelectorTitle).text().trim() manga.title = element.select(MLConstants.latestUpdatesSelectorTitle).text().trim()
manga.thumbnail_url = element.select(MLConstants.latestUpdatesSelectorThumbnailUrl).attr("abs:src").replace("//", "/") manga.thumbnail_url = getImage(element.select(MLConstants.latestUpdatesSelectorThumbnailUrl)).replace("//", "/")
return manga return manga
} }
@ -113,9 +115,11 @@ class ManhwaLatinoSiteParser(
private fun getMangasFromSearchSite(document: Document): List<SManga> { private fun getMangasFromSearchSite(document: Document): List<SManga> {
return document.select(MLConstants.searchSiteMangasHTMLSelector).map { return document.select(MLConstants.searchSiteMangasHTMLSelector).map {
val manga = SManga.create() val manga = SManga.create()
manga.url = getUrlWithoutDomain(it.select(MLConstants.searchPageUrlHTMLSelector).attr("abs:href")) manga.url = getUrlWithoutDomain(
it.select(MLConstants.searchPageUrlHTMLSelector).attr("abs:href")
)
manga.title = it.select(MLConstants.searchPageTitleHTMLSelector).text().trim() manga.title = it.select(MLConstants.searchPageTitleHTMLSelector).text().trim()
manga.thumbnail_url = it.select(MLConstants.searchPageThumbnailUrlMangaHTMLSelector).attr("abs:src") manga.thumbnail_url = getImage(it.select(MLConstants.searchPageThumbnailUrlMangaHTMLSelector))
manga manga
} }
} }
@ -133,9 +137,11 @@ class ManhwaLatinoSiteParser(
*/ */
fun getMangaFromList(element: Element): SManga { fun getMangaFromList(element: Element): SManga {
val manga = SManga.create() val manga = SManga.create()
manga.url = getUrlWithoutDomain(element.select(MLConstants.popularGenreUrlHTMLSelector).attr("abs:href")) manga.url = getUrlWithoutDomain(
element.select(MLConstants.popularGenreUrlHTMLSelector).attr("abs:href")
)
manga.title = element.select(MLConstants.popularGenreTitleHTMLSelector).text().trim() manga.title = element.select(MLConstants.popularGenreTitleHTMLSelector).text().trim()
manga.thumbnail_url = element.select(MLConstants.popularGenreThumbnailUrlMangaHTMLSelector).attr("abs:src") manga.thumbnail_url = getImage(element.select(MLConstants.popularGenreThumbnailUrlMangaHTMLSelector))
return manga return manga
} }
@ -149,7 +155,8 @@ class ManhwaLatinoSiteParser(
val titleElements = document.select("#manga-title h1") val titleElements = document.select("#manga-title h1")
val mangaType = getMangaBadges(titleElements) val mangaType = getMangaBadges(titleElements)
val descriptionList = document.select(MLConstants.mangaDetailsDescriptionHTMLSelector).map { it.text() } val descriptionList =
document.select(MLConstants.mangaDetailsDescriptionHTMLSelector).map { it.text() }
val author = document.select(MLConstants.mangaDetailsAuthorHTMLSelector).text() val author = document.select(MLConstants.mangaDetailsAuthorHTMLSelector).text()
val artist = document.select(MLConstants.mangaDetailsArtistHTMLSelector).text() val artist = document.select(MLConstants.mangaDetailsArtistHTMLSelector).text()
@ -158,8 +165,7 @@ class ManhwaLatinoSiteParser(
val genreTagList = genrelist + tagList val genreTagList = genrelist + tagList
manga.title = titleElements.last().ownText().trim() manga.title = titleElements.last().ownText().trim()
manga.thumbnail_url = manga.thumbnail_url = getImage(document.select(MLConstants.mangaDetailsThumbnailUrlHTMLSelector))
document.select(MLConstants.mangaDetailsThumbnailUrlHTMLSelector).attr("abs:src")
manga.description = descriptionList.joinToString("\n") manga.description = descriptionList.joinToString("\n")
manga.author = author.ifBlank { "Autor Desconocido" } manga.author = author.ifBlank { "Autor Desconocido" }
manga.artist = artist manga.artist = artist
@ -238,7 +244,8 @@ class ManhwaLatinoSiteParser(
* Get The String with the information about the Release date of the Chapter * Get The String with the information about the Release date of the Chapter
*/ */
private fun getChapterReleaseDate(element: Element): String { private fun getChapterReleaseDate(element: Element): String {
val chapterReleaseDateLink = element.select(MLConstants.chapterReleaseDateLinkParser).attr("title") val chapterReleaseDateLink =
element.select(MLConstants.chapterReleaseDateLinkParser).attr("title")
val chapterReleaseDateI = element.select(MLConstants.chapterReleaseDateIParser).text() val chapterReleaseDateI = element.select(MLConstants.chapterReleaseDateIParser).text()
return when { return when {
chapterReleaseDateLink.isNotEmpty() -> chapterReleaseDateLink chapterReleaseDateLink.isNotEmpty() -> chapterReleaseDateLink
@ -296,9 +303,10 @@ class ManhwaLatinoSiteParser(
*/ */
fun getPageListParse(response: Response): List<Page> { fun getPageListParse(response: Response): List<Page> {
val list = val list =
response.asJsoup().select(MLConstants.pageListParseSelector).mapIndexed { index, imgElement -> response.asJsoup().select(MLConstants.pageListParseSelector)
Page(index, "", imgElement.attr("abs:src")) .mapIndexed { index, imgElement ->
} Page(index, "", getImage(imgElement))
}
return list return list
} }
@ -357,4 +365,28 @@ class ManhwaLatinoSiteParser(
* Create a Address url without the base url. * Create a Address url without the base url.
*/ */
private fun getUrlWithoutDomain(url: String) = url.substringAfter(baseUrl) private fun getUrlWithoutDomain(url: String) = url.substringAfter(baseUrl)
/**
* Extract the Image from the Html Element
* The website changes often the attr of the images
* data-src or src
*/
private fun getImage(elements: Elements): String {
var imageUrl: String = elements.attr(MLConstants.imageAttribute)
if (imageUrl.isEmpty())
imageUrl = elements.attr("abs:src")
return imageUrl
}
/**
* Extract the Image from the Html Element
* The website changes often the attr of the images
* data-src or src
*/
private fun getImage(element: Element): String {
var imageUrl = element.attr(MLConstants.imageAttribute)
if (imageUrl.isEmpty())
imageUrl = element.attr("abs:src")
return imageUrl
}
} }