MomonGA: add source (#9122)
This commit is contained in:
parent
32a264c4bb
commit
a07cc9f52b
8
src/ja/momonga/build.gradle
Normal file
8
src/ja/momonga/build.gradle
Normal file
@ -0,0 +1,8 @@
|
|||||||
|
ext {
|
||||||
|
extName = 'MomonGA'
|
||||||
|
extClass = '.MomonGA'
|
||||||
|
extVersionCode = 1
|
||||||
|
isNsfw = true
|
||||||
|
}
|
||||||
|
|
||||||
|
apply from: "$rootDir/common.gradle"
|
BIN
src/ja/momonga/res/mipmap-hdpi/ic_launcher.png
Normal file
BIN
src/ja/momonga/res/mipmap-hdpi/ic_launcher.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 6.8 KiB |
BIN
src/ja/momonga/res/mipmap-mdpi/ic_launcher.png
Normal file
BIN
src/ja/momonga/res/mipmap-mdpi/ic_launcher.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 3.4 KiB |
BIN
src/ja/momonga/res/mipmap-xhdpi/ic_launcher.png
Normal file
BIN
src/ja/momonga/res/mipmap-xhdpi/ic_launcher.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 11 KiB |
BIN
src/ja/momonga/res/mipmap-xxhdpi/ic_launcher.png
Normal file
BIN
src/ja/momonga/res/mipmap-xxhdpi/ic_launcher.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 22 KiB |
BIN
src/ja/momonga/res/mipmap-xxxhdpi/ic_launcher.png
Normal file
BIN
src/ja/momonga/res/mipmap-xxxhdpi/ic_launcher.png
Normal file
Binary file not shown.
After Width: | Height: | Size: 37 KiB |
@ -0,0 +1,160 @@
|
|||||||
|
package eu.kanade.tachiyomi.extension.ja.momonga
|
||||||
|
|
||||||
|
import eu.kanade.tachiyomi.network.GET
|
||||||
|
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
|
||||||
|
import eu.kanade.tachiyomi.source.model.SManga.Companion.COMPLETED
|
||||||
|
import eu.kanade.tachiyomi.source.online.HttpSource
|
||||||
|
import eu.kanade.tachiyomi.util.asJsoup
|
||||||
|
import keiyoushi.utils.tryParse
|
||||||
|
import okhttp3.HttpUrl.Companion.toHttpUrl
|
||||||
|
import okhttp3.OkHttpClient
|
||||||
|
import okhttp3.Request
|
||||||
|
import okhttp3.Response
|
||||||
|
import java.text.SimpleDateFormat
|
||||||
|
import java.util.Locale
|
||||||
|
|
||||||
|
class MomonGA : HttpSource() {
|
||||||
|
override val lang = "ja"
|
||||||
|
override val name = "momon:GA"
|
||||||
|
override val supportsLatest = false
|
||||||
|
|
||||||
|
override val baseUrl = "https://momon-ga.com"
|
||||||
|
|
||||||
|
override val client: OkHttpClient = network.cloudflareClient
|
||||||
|
|
||||||
|
// Chapters
|
||||||
|
|
||||||
|
private val dateFormat = SimpleDateFormat("yyyy年M月d日H時", Locale.ENGLISH)
|
||||||
|
|
||||||
|
override fun chapterListParse(response: Response): List<SChapter> {
|
||||||
|
val document = response.asJsoup()
|
||||||
|
return listOf(
|
||||||
|
SChapter.create().apply {
|
||||||
|
name = "単一章"
|
||||||
|
url = response.request.url.encodedPath
|
||||||
|
date_upload = dateFormat.tryParse(document.select("#post-time").text())
|
||||||
|
},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun imageUrlParse(response: Response): String = throw UnsupportedOperationException()
|
||||||
|
|
||||||
|
// LatestUpdate (Not supported)
|
||||||
|
|
||||||
|
override fun latestUpdatesParse(response: Response): MangasPage =
|
||||||
|
throw UnsupportedOperationException()
|
||||||
|
|
||||||
|
override fun latestUpdatesRequest(page: Int): Request = throw UnsupportedOperationException()
|
||||||
|
|
||||||
|
// Details
|
||||||
|
|
||||||
|
override fun mangaDetailsParse(response: Response): SManga {
|
||||||
|
val document = response.asJsoup()
|
||||||
|
|
||||||
|
return SManga.create().apply {
|
||||||
|
document.select("#post-tag > div.post-tag-table").forEach { div ->
|
||||||
|
when (div.selectFirst("div.post-tag-title")!!.text()) {
|
||||||
|
"サークル" -> {
|
||||||
|
artist = div.select("div.post-tags > a").joinToString { it.text() }
|
||||||
|
}
|
||||||
|
|
||||||
|
"作者" -> {
|
||||||
|
author = div.select("div.post-tags > a").joinToString { it.text() }
|
||||||
|
}
|
||||||
|
|
||||||
|
"内容" -> {
|
||||||
|
genre = div.select("div.post-tags > a").joinToString { it.text() }
|
||||||
|
}
|
||||||
|
|
||||||
|
else -> {}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
title = document.selectFirst("#post-data > h1")!!.text()
|
||||||
|
thumbnail_url = document.selectFirst("#post-hentai > img")?.absUrl("src")
|
||||||
|
status = COMPLETED
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Pages
|
||||||
|
|
||||||
|
override fun pageListParse(response: Response): List<Page> = mutableListOf<Page>().apply {
|
||||||
|
val document = response.asJsoup()
|
||||||
|
|
||||||
|
document.select("#post-hentai > img").forEachIndexed { index, element ->
|
||||||
|
add(Page(index, imageUrl = element.attr("src")))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Popular
|
||||||
|
|
||||||
|
override fun popularMangaParse(response: Response): MangasPage {
|
||||||
|
val document = response.asJsoup()
|
||||||
|
|
||||||
|
val lis = mutableListOf<SManga>()
|
||||||
|
document.select("div.post-list > a").forEach { element ->
|
||||||
|
lis.add(
|
||||||
|
SManga.create().apply {
|
||||||
|
setUrlWithoutDomain(element.absUrl("href"))
|
||||||
|
title = element.selectFirst("span")!!.text()
|
||||||
|
thumbnail_url = element.selectFirst("div.post-list-image > img")?.absUrl("src")
|
||||||
|
},
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
return MangasPage(lis, document.selectFirst("div.wp-pagenavi > a.nextpostslink") != null)
|
||||||
|
}
|
||||||
|
|
||||||
|
override fun popularMangaRequest(page: Int): Request = GET("$baseUrl/popularity/", headers)
|
||||||
|
|
||||||
|
// Search
|
||||||
|
|
||||||
|
override fun searchMangaParse(response: Response): MangasPage = popularMangaParse(response)
|
||||||
|
|
||||||
|
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
|
||||||
|
val urlBuilder = baseUrl.toHttpUrl().newBuilder().apply {
|
||||||
|
if (query != "" && !query.contains("-")) {
|
||||||
|
addQueryParameter("s", query)
|
||||||
|
} else {
|
||||||
|
val path =
|
||||||
|
filters.filterIsInstance<UriPartFilter>().joinToString("") { it.toUriPart() }
|
||||||
|
addEncodedPathSegments(path)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (page > 1) {
|
||||||
|
urlBuilder.addPathSegments("page/$page")
|
||||||
|
}
|
||||||
|
|
||||||
|
return GET(urlBuilder.build().toString(), headers)
|
||||||
|
}
|
||||||
|
|
||||||
|
// Filters
|
||||||
|
|
||||||
|
override fun getFilterList() = FilterList(
|
||||||
|
CategoryGroupFiler(),
|
||||||
|
)
|
||||||
|
|
||||||
|
private class CategoryGroupFiler : UriPartFilter(
|
||||||
|
"カテゴリーグループ",
|
||||||
|
arrayOf(
|
||||||
|
Pair("同人誌", "fanzine"),
|
||||||
|
Pair("商業誌", "magazine"),
|
||||||
|
Pair("急上昇", "trend"),
|
||||||
|
Pair("人気", "popularity"),
|
||||||
|
Pair("高評価", "rated"),
|
||||||
|
),
|
||||||
|
)
|
||||||
|
|
||||||
|
private open class UriPartFilter(
|
||||||
|
displayName: String,
|
||||||
|
val vals: Array<Pair<String, String>>,
|
||||||
|
defaultValue: Int = 0,
|
||||||
|
) : Filter.Select<String>(displayName, vals.map { it.first }.toTypedArray(), defaultValue) {
|
||||||
|
open fun toUriPart() = vals[state].second
|
||||||
|
}
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user