Remove ReadAllManga & ReadAllComic cleanup (#4124)

* Remove ReadAllManga

* requested changes and popular title cleanup

* better name?

* reorder if conditions
This commit is contained in:
AwkwardPeak7 2024-07-21 13:26:01 +05:00 committed by Draff
parent 3908c908ca
commit 2be998797f
No known key found for this signature in database
GPG Key ID: E8A89F3211677653
16 changed files with 60 additions and 119 deletions

View File

@ -1,5 +0,0 @@
plugins {
id("lib-multisrc")
}
baseVersionCode = 1

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

View File

@ -1,9 +1,7 @@
ext { ext {
extName = 'ReadAllComics' extName = 'ReadAllComics'
extClass = '.ReadAllComicsCom' extClass = '.ReadAllComics'
themePkg = 'readallcomics' extVersionCode = 3
baseUrl = 'https://readallcomics.com'
overrideVersionCode = 1
} }
apply from: "$rootDir/common.gradle" apply from: "$rootDir/common.gradle"

View File

@ -1,4 +1,4 @@
package eu.kanade.tachiyomi.multisrc.readallcomics package eu.kanade.tachiyomi.extension.en.readallcomicscom
import eu.kanade.tachiyomi.network.GET import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.network.asObservableSuccess import eu.kanade.tachiyomi.network.asObservableSuccess
@ -10,8 +10,10 @@ import eu.kanade.tachiyomi.source.model.SChapter
import eu.kanade.tachiyomi.source.model.SManga 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.HttpUrl.Companion.toHttpUrl
import okhttp3.HttpUrl.Companion.toHttpUrlOrNull import okhttp3.HttpUrl.Companion.toHttpUrlOrNull
import okhttp3.Interceptor import okhttp3.Interceptor
import okhttp3.Request
import okhttp3.Response import okhttp3.Response
import org.jsoup.Jsoup import org.jsoup.Jsoup
import org.jsoup.nodes.Document import org.jsoup.nodes.Document
@ -19,11 +21,13 @@ import org.jsoup.nodes.Element
import org.jsoup.select.Elements import org.jsoup.select.Elements
import rx.Observable import rx.Observable
abstract class ReadAllComics( class ReadAllComics : ParsedHttpSource() {
override val name: String,
override val baseUrl: String, override val name = "ReadAllComics"
override val lang: String,
) : ParsedHttpSource() { override val baseUrl = "https://readallcomics.com"
override val lang = "en"
override val supportsLatest = false override val supportsLatest = false
@ -34,7 +38,7 @@ abstract class ReadAllComics(
.rateLimit(2) .rateLimit(2)
.build() .build()
protected open fun archivedCategoryInterceptor(chain: Interceptor.Chain): Response { private fun archivedCategoryInterceptor(chain: Interceptor.Chain): Response {
val request = chain.request() val request = chain.request()
val response = chain.proceed(request) val response = chain.proceed(request)
@ -43,7 +47,7 @@ abstract class ReadAllComics(
request.url.toString(), request.url.toString(),
) )
val newUrl = document.selectFirst(archivedCategorySelector()) val newUrl = document.selectFirst(".description-archive > p > span > a")
?.attr("href")?.toHttpUrlOrNull() ?.attr("href")?.toHttpUrlOrNull()
?: return response ?: return response
@ -60,33 +64,18 @@ abstract class ReadAllComics(
return response return response
} }
protected open fun archivedCategorySelector() = ".description-archive > p > span > a"
override fun popularMangaRequest(page: Int) = override fun popularMangaRequest(page: Int) =
GET("$baseUrl${if (page > 1)"/page/$page/" else ""}", headers) GET("$baseUrl${if (page > 1)"/page/$page/" else ""}", headers)
override fun popularMangaParse(response: Response): MangasPage { override fun popularMangaFromElement(element: Element): SManga {
val document = response.asJsoup()
val mangas = document.select(popularMangaSelector()).mapNotNull {
nullablePopularManga(it)
}
val hasNextPage = document.select(popularMangaNextPageSelector()).first() != null
return MangasPage(mangas, hasNextPage)
}
protected open fun nullablePopularManga(element: Element): SManga? {
val manga = SManga.create().apply { val manga = SManga.create().apply {
val category = element.classNames() val category = element.classNames()
.firstOrNull { it.startsWith("category-") } .firstOrNull { it.startsWith("category-") }!!
?.substringAfter("category-") .substringAfter("category-")
?: return null
url = "/category/$category/" url = "/category/$category/"
title = element.select(popularMangaTitleSelector()).text() title = category.replace("-", " ").capitalizeEachWord()
thumbnail_url = element.select(popularMangaThumbnailSelector()).attr("abs:src") thumbnail_url = element.select("img").attr("abs:src")
} }
return manga return manga
@ -94,8 +83,6 @@ abstract class ReadAllComics(
override fun popularMangaSelector() = "#post-area > div" override fun popularMangaSelector() = "#post-area > div"
override fun popularMangaNextPageSelector() = "div.pagenavi > a.next" override fun popularMangaNextPageSelector() = "div.pagenavi > a.next"
protected open fun popularMangaTitleSelector() = "h2"
protected open fun popularMangaThumbnailSelector() = "img"
override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable<MangasPage> { override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable<MangasPage> {
return if (page == 1) { return if (page == 1) {
@ -107,10 +94,15 @@ abstract class ReadAllComics(
} }
} }
override fun searchMangaRequest(page: Int, query: String, filters: FilterList) = override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
GET("$baseUrl/?story=${query.trim()}&s=&type=${searchType()}", headers) val url = baseUrl.toHttpUrl().newBuilder().apply {
addQueryParameter("story", query)
addQueryParameter("s", "")
addQueryParameter("type", "comic")
}.build()
protected open fun searchType() = "comic" return GET(url, headers)
}
override fun searchMangaParse(response: Response): MangasPage { override fun searchMangaParse(response: Response): MangasPage {
searchPageElements = response.asJsoup().select(searchMangaSelector()) searchPageElements = response.asJsoup().select(searchMangaSelector())
@ -133,27 +125,32 @@ abstract class ReadAllComics(
override fun searchMangaFromElement(element: Element) = SManga.create().apply { override fun searchMangaFromElement(element: Element) = SManga.create().apply {
setUrlWithoutDomain(element.attr("href")) setUrlWithoutDomain(element.attr("href"))
title = element.text().trim() title = element.text()
thumbnail_url = searchCover thumbnail_url = "https://fakeimg.pl/200x300/?text=No%20Cover%0AOn%20Search&font_size=62"
} }
override fun searchMangaSelector() = ".categories a" override fun searchMangaSelector() = ".categories a"
override fun searchMangaNextPageSelector() = null override fun searchMangaNextPageSelector() = null
override fun mangaDetailsParse(document: Document) = SManga.create().apply { override fun mangaDetailsParse(document: Document) = SManga.create().apply {
title = document.select(mangaDetailsTitleSelector()).text().trim() title = document.selectFirst("h1")!!.text()
genre = document.select(mangaDetailsGenreSelector()).joinToString { it.text().trim() } genre = document.select("p strong").joinToString { it.text() }
author = document.select(mangaDetailsAuthorSelector()).last()?.text()?.trim() author = document.select("p > strong").last()?.text()
description = document.select(mangaDetailsDescriptionSelector()).text().trim() description = buildString {
thumbnail_url = document.select(mangaDetailsThumbnailSelector()).attr("abs:src") document.select(".b > strong").forEach { element ->
val vol = element.previousElementSibling()
if (isNotBlank()) {
append("\n\n")
}
if (vol?.tagName() == "span") {
append(vol.text(), "\n")
}
append(element.text())
}
}
thumbnail_url = document.select("p img").attr("abs:src")
} }
protected open fun mangaDetailsTitleSelector() = "h1"
protected open fun mangaDetailsGenreSelector() = "p strong"
protected open fun mangaDetailsAuthorSelector() = "p > strong"
protected open fun mangaDetailsDescriptionSelector() = ".b > strong"
protected open fun mangaDetailsThumbnailSelector() = "p img"
override fun chapterListSelector() = ".list-story a" override fun chapterListSelector() = ".list-story a"
override fun chapterFromElement(element: Element) = SChapter.create().apply { override fun chapterFromElement(element: Element) = SChapter.create().apply {
@ -162,15 +159,25 @@ abstract class ReadAllComics(
} }
override fun pageListParse(document: Document): List<Page> { override fun pageListParse(document: Document): List<Page> {
return document.select(pageListSelector()).mapIndexed { idx, element -> return document.select("body img:not(body div[id=\"logo\"] img)").mapIndexed { idx, element ->
Page(idx, "", element.attr("abs:src")) Page(idx, "", element.attr("abs:src"))
} }
} }
protected open fun pageListSelector() = "body > div img" private fun String.capitalizeEachWord(): String {
val result = StringBuilder(length)
companion object { var capitalize = true
private const val searchCover = "https://fakeimg.pl/200x300/?text=No%20Cover%0AOn%20Search&font_size=62" for (char in this) {
result.append(
if (capitalize) {
char.uppercase()
} else {
char.lowercase()
},
)
capitalize = char.isWhitespace()
}
return result.toString()
} }
override fun imageUrlParse(document: Document) = override fun imageUrlParse(document: Document) =
@ -183,6 +190,4 @@ abstract class ReadAllComics(
throw UnsupportedOperationException() throw UnsupportedOperationException()
override fun latestUpdatesNextPageSelector() = override fun latestUpdatesNextPageSelector() =
throw UnsupportedOperationException() throw UnsupportedOperationException()
override fun popularMangaFromElement(element: Element) =
throw UnsupportedOperationException()
} }

View File

@ -1,25 +0,0 @@
package eu.kanade.tachiyomi.extension.en.readallcomicscom
import eu.kanade.tachiyomi.multisrc.readallcomics.ReadAllComics
import eu.kanade.tachiyomi.source.model.SManga
import org.jsoup.nodes.Element
class ReadAllComicsCom : ReadAllComics("ReadAllComics", "https://readallcomics.com", "en") {
override fun nullablePopularManga(element: Element): SManga? {
return super.nullablePopularManga(element)?.apply {
title = title.let {
titleRegex.find(it)?.value?.trim()
?.removeSuffix("v")?.trim()
?.substringBeforeLast("vol")
?: it
}
}
}
override fun pageListSelector() = "body img:not(body div[id=\"logo\"] img)"
companion object {
private val titleRegex = Regex("""^([a-zA-Z_.\s\-:]*)""")
}
}

View File

@ -1,9 +0,0 @@
ext {
extName = 'ReadAllManga'
extClass = '.ReadAllManga'
themePkg = 'readallcomics'
baseUrl = 'https://readallmanga.com'
overrideVersionCode = 0
}
apply from: "$rootDir/common.gradle"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 4.0 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

View File

@ -1,23 +0,0 @@
package eu.kanade.tachiyomi.extension.en.readallmanga
import eu.kanade.tachiyomi.multisrc.readallcomics.ReadAllComics
import eu.kanade.tachiyomi.source.model.SManga
import org.jsoup.nodes.Document
class ReadAllManga : ReadAllComics("ReadAllManga", "https://readallmanga.com", "en") {
override fun searchType() = "manga"
override fun popularMangaTitleSelector() = "div > center"
override fun mangaDetailsParse(document: Document): SManga {
return super.mangaDetailsParse(document).apply {
genre = document.select(mangaDetailsGenreSelector()).text()
.split("").joinToString { it.trim() }
}
}
override fun mangaDetailsDescriptionSelector() = ".b > span"
override fun mangaDetailsGenreSelector() = ".b > p > strong:nth-child(8)"
override fun mangaDetailsAuthorSelector() = ".b > p > strong:nth-child(5)"
}