Add vgperson extension (#1585)

* Add vgperson extension

* Get vgperson covers from imgur
This commit is contained in:
ObserverOfTime 2019-10-10 02:01:17 +03:00 committed by arkon
parent a27ea45025
commit 2be3e517c4
8 changed files with 147 additions and 0 deletions

View File

@ -0,0 +1,12 @@
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
ext {
appName = 'Tachiyomi: vgperson'
pkgNameSuffix = 'en.vgperson'
extClass = '.Vgperson'
extVersionCode = 1
libVersion = '1.2'
}
apply from: "$rootDir/common.gradle"

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.9 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 2.5 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 7.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 15 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 131 KiB

View File

@ -0,0 +1,135 @@
package eu.kanade.tachiyomi.extension.en.vgperson
import android.os.Build.VERSION
import eu.kanade.tachiyomi.extension.BuildConfig
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.network.asObservableSuccess
import eu.kanade.tachiyomi.source.model.*
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import okhttp3.Headers
import okhttp3.Response
import org.jsoup.nodes.Document
import org.jsoup.nodes.Element
import org.jsoup.nodes.TextNode
import rx.Observable
class Vgperson : ParsedHttpSource() {
override val name = "vgperson"
override val lang = "en"
override val supportsLatest = false
override val baseUrl = "http://vgperson.com/other/mangaviewer.php"
private val userAgent = "Mozilla/5.0 " +
"(Android ${VERSION.RELEASE}; Mobile) " +
"Tachiyomi/${BuildConfig.VERSION_NAME}"
override fun headersBuilder() = Headers.Builder().apply {
add("User-Agent", userAgent)
add("Referer", baseUrl)
}
override fun popularMangaSelector() = ".content a[href^=?m]"
override fun popularMangaNextPageSelector() = null
override fun popularMangaRequest(page: Int) = GET(baseUrl, headers)
override fun popularMangaFromElement(element: Element) = SManga.create().apply {
title = element.text()
url = element.attr("href")
thumbnail_url = getCover(title)
}
override fun fetchMangaDetails(manga: SManga) =
client.newCall(mangaDetailsRequest(manga)).asObservableSuccess().map {
mangaDetailsParse(it).apply {
url = manga.url
title = manga.title
thumbnail_url = manga.thumbnail_url
initialized = true
}
}
override fun mangaDetailsParse(document: Document) = SManga.create().apply {
status = when (document.select(".chaptername").first().text()) {
"(Complete)" -> SManga.COMPLETED
"(Series in Progress)" -> SManga.ONGOING
else -> SManga.UNKNOWN
}
description = document.select(".content").first()
.childNodes().drop(5).takeWhile {
it.nodeName() != "table"
}.joinToString("") {
if (it is TextNode) it.text()
else when ((it as Element).tagName()) {
"br" -> "\n"
else -> it.text()
}
}
}
override fun chapterListSelector() = ".chaptertable tbody tr"
override fun chapterFromElement(element: Element) = SChapter.create().apply {
element.select("td > a").first().let {
name = it.text()
url = it.attr("href")
}
// append the name if it exists & remove the occasional hyphen
element.select(".chaptername")?.first()?.let {
name += " - ${it.text().substringAfter("- ")}"
}
// hardcode special chapter numbers for Three Days of Happiness
chapter_number = url.substringAfterLast("c=").toFloatOrNull()
?: 16.5f + "0.${url.substringAfterLast("b=")}".toFloat()
scanlator = "vgperson"
date_upload = 0L
}
override fun chapterListParse(response: Response) =
super.chapterListParse(response).sortedByDescending(SChapter::chapter_number)
override fun pageListParse(document: Document) =
document.select("img").mapIndexed { i, img -> Page(i, "", img.attr("src")) }
override fun fetchSearchManga(page: Int, query: String, filters: FilterList):
Observable<MangasPage> = Observable.empty()
// get known manga covers from imgur
private fun getCover(title: String) = when (title) {
"The Festive Monster's Cheerful Failure" -> "kEK10GL.png"
"Azure and Claude" -> "buXnlmh.jpg"
"Three Days of Happiness" -> "kL5dvnp.jpg"
else -> null
}?.let { "http://i.imgur.com/$it" }
override fun latestUpdatesSelector() = ""
override fun latestUpdatesNextPageSelector() = null
override fun latestUpdatesRequest(page: Int) =
throw UnsupportedOperationException("This method should not be called!")
override fun latestUpdatesFromElement(element: Element) =
throw UnsupportedOperationException("This method should not be called!")
override fun searchMangaSelector() = ""
override fun searchMangaNextPageSelector() = null
override fun searchMangaRequest(page: Int, query: String, filters: FilterList) =
throw UnsupportedOperationException("This method should not be called!")
override fun searchMangaFromElement(element: Element) =
throw UnsupportedOperationException("This method should not be called!")
override fun searchMangaParse(response: Response) =
throw UnsupportedOperationException("This method should not be called!")
override fun imageUrlParse(document: Document) =
throw UnsupportedOperationException("This method should not be called!")
}