Comic Fx: add project page & series type (#14374)
This commit is contained in:
parent
777f677175
commit
563e179abe
@ -6,7 +6,7 @@ ext {
|
|||||||
extName = 'Comic Fx'
|
extName = 'Comic Fx'
|
||||||
pkgNameSuffix = 'id.comicfx'
|
pkgNameSuffix = 'id.comicfx'
|
||||||
extClass = '.ComicFx'
|
extClass = '.ComicFx'
|
||||||
extVersionCode = 4
|
extVersionCode = 5
|
||||||
}
|
}
|
||||||
|
|
||||||
apply from: "$rootDir/common.gradle"
|
apply from: "$rootDir/common.gradle"
|
||||||
|
@ -41,13 +41,14 @@ class ComicFx : ParsedHttpSource() {
|
|||||||
return GET("$baseUrl/filterList?page=$page&sortBy=name&asc=true", headers)
|
return GET("$baseUrl/filterList?page=$page&sortBy=name&asc=true", headers)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun popularMangaSelector() = "div.media"
|
// combining selector for "popular" and "latest" to be used for "search" selector as it need both selector
|
||||||
|
override fun popularMangaSelector() = "div.media, div.daftar-komik .komika"
|
||||||
|
|
||||||
override fun popularMangaFromElement(element: Element): SManga {
|
override fun popularMangaFromElement(element: Element): SManga {
|
||||||
val manga = SManga.create()
|
val manga = SManga.create()
|
||||||
manga.thumbnail_url = element.select(".media-left a img").attr("abs:data-src")
|
manga.thumbnail_url = element.select(".media-left a img, .komik-img a .batas img").attr("abs:data-src")
|
||||||
manga.title = element.select(".media-body .media-heading a strong").text()
|
manga.title = element.select(".media-body .media-heading a strong, .komik-des a h3").text()
|
||||||
val item = element.select(".media-left a")
|
val item = element.select(".media-left a, div.komik-img a")
|
||||||
manga.setUrlWithoutDomain(item.attr("href"))
|
manga.setUrlWithoutDomain(item.attr("href"))
|
||||||
|
|
||||||
return manga
|
return manga
|
||||||
@ -60,17 +61,9 @@ class ComicFx : ParsedHttpSource() {
|
|||||||
return GET("$baseUrl/latest-release?page=$page", headers)
|
return GET("$baseUrl/latest-release?page=$page", headers)
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun latestUpdatesSelector() = "div.daftar-komik .komika"
|
override fun latestUpdatesSelector() = popularMangaSelector()
|
||||||
|
|
||||||
override fun latestUpdatesFromElement(element: Element): SManga {
|
override fun latestUpdatesFromElement(element: Element): SManga = popularMangaFromElement(element)
|
||||||
val manga = SManga.create()
|
|
||||||
manga.thumbnail_url = element.select(".komik-img a .batas img").attr("abs:data-src")
|
|
||||||
manga.title = element.select(".komik-des a h3").text()
|
|
||||||
val item = element.select("div.komik-img a")
|
|
||||||
manga.setUrlWithoutDomain(item.attr("href"))
|
|
||||||
|
|
||||||
return manga
|
|
||||||
}
|
|
||||||
|
|
||||||
override fun latestUpdatesNextPageSelector() = popularMangaNextPageSelector()
|
override fun latestUpdatesNextPageSelector() = popularMangaNextPageSelector()
|
||||||
|
|
||||||
@ -117,6 +110,14 @@ class ComicFx : ParsedHttpSource() {
|
|||||||
is TypeFilter -> url.addQueryParameter("ctype", filter.toUriPart())
|
is TypeFilter -> url.addQueryParameter("ctype", filter.toUriPart())
|
||||||
is AuthorFilter -> url.addQueryParameter("author", filter.state)
|
is AuthorFilter -> url.addQueryParameter("author", filter.state)
|
||||||
is ArtistFilter -> url.addQueryParameter("artist", filter.state)
|
is ArtistFilter -> url.addQueryParameter("artist", filter.state)
|
||||||
|
|
||||||
|
// if site has project page, default value "hasProjectPage" = false
|
||||||
|
is ProjectFilter -> {
|
||||||
|
if (filter.toUriPart() == "project-filter-on") {
|
||||||
|
url.setPathSegment(0, "/latest-project".substring(1))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else -> { /* Do Nothing */ }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -137,7 +138,18 @@ class ComicFx : ParsedHttpSource() {
|
|||||||
artist = document.select(".infolengkap span:contains(Artist) a, #artist").text()
|
artist = document.select(".infolengkap span:contains(Artist) a, #artist").text()
|
||||||
status = parseStatus(document.select(".infolengkap span:contains(status) i").text())
|
status = parseStatus(document.select(".infolengkap span:contains(status) i").text())
|
||||||
description = document.select("div.sinopsis p").text()
|
description = document.select("div.sinopsis p").text()
|
||||||
genre = document.select(".genre-komik a").joinToString { it.text() }
|
|
||||||
|
// Add series type (manga/manhwa/manhua/other) to genre
|
||||||
|
val genres = document.select(".genre-komik a").map { it.text() }.toMutableList()
|
||||||
|
document.selectFirst(".infokomik .type")?.ownText().takeIf { it.isNullOrBlank().not() }?.let { genres.add(it) }
|
||||||
|
genre = genres.map { genre ->
|
||||||
|
genre.lowercase(Locale.forLanguageTag(lang)).replaceFirstChar { char ->
|
||||||
|
if (char.isLowerCase()) char.titlecase(Locale.forLanguageTag(lang))
|
||||||
|
else char.toString()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.joinToString { it.trim() }
|
||||||
|
|
||||||
thumbnail_url = document.select(".thumb img").attr("abs:src")
|
thumbnail_url = document.select(".thumb img").attr("abs:src")
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -209,7 +221,11 @@ class ComicFx : ParsedHttpSource() {
|
|||||||
StatusFilter(),
|
StatusFilter(),
|
||||||
TypeFilter(),
|
TypeFilter(),
|
||||||
ArtistFilter("Artist"),
|
ArtistFilter("Artist"),
|
||||||
AuthorFilter("Author")
|
AuthorFilter("Author"),
|
||||||
|
Filter.Separator(),
|
||||||
|
Filter.Header("NOTE: Can't be used with other filter!"),
|
||||||
|
Filter.Header("$name Project List page"),
|
||||||
|
ProjectFilter(),
|
||||||
)
|
)
|
||||||
|
|
||||||
private class ArtistFilter(name: String) : Filter.Text(name)
|
private class ArtistFilter(name: String) : Filter.Text(name)
|
||||||
@ -284,6 +300,14 @@ class ComicFx : ParsedHttpSource() {
|
|||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
|
||||||
|
private class ProjectFilter : UriPartFilter(
|
||||||
|
"Filter Project",
|
||||||
|
arrayOf(
|
||||||
|
Pair("", "Show all manga"),
|
||||||
|
Pair("project-filter-on", "Show only project manga")
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
private open class UriPartFilter(displayName: String, val vals: Array<Pair<String, String>>) :
|
private open class UriPartFilter(displayName: String, val vals: Array<Pair<String, String>>) :
|
||||||
Filter.Select<String>(displayName, vals.map { it.second }.toTypedArray()) {
|
Filter.Select<String>(displayName, vals.map { it.second }.toTypedArray()) {
|
||||||
fun toUriPart() = vals[state].first
|
fun toUriPart() = vals[state].first
|
||||||
|
Loading…
x
Reference in New Issue
Block a user