Remove WPManga, Mangazuki, ShoujoSense

This commit is contained in:
Eugene Cheung 2019-07-13 11:14:10 -04:00
parent becbf4b442
commit 88903c5fda
No known key found for this signature in database
GPG Key ID: E1FD745328866B0A
25 changed files with 0 additions and 533 deletions

View File

@ -1,12 +0,0 @@
apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
ext {
appName = 'Tachiyomi: WPManga (Many sources)'
pkgNameSuffix = 'all.wpmanga'
extClass = '.WpMangaFactory'
extVersionCode = 3
libVersion = '1.2'
}
apply from: "$rootDir/common.gradle"

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.8 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 16 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 56 KiB

View File

@ -1,194 +0,0 @@
package eu.kanade.tachiyomi.extension.all.wpmanga
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.source.model.FilterList
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.online.ParsedHttpSource
import okhttp3.Request
import org.jsoup.nodes.Document
import org.jsoup.nodes.Element
import java.text.SimpleDateFormat
import java.util.*
open class WpManga(override val name: String, override val baseUrl: String, override val lang: String) : ParsedHttpSource() {
override val supportsLatest = false
override fun popularMangaSelector() = "div[id^=manga-item]"
override fun popularMangaRequest(page: Int): Request = GET(baseUrl, headers)
override fun latestUpdatesNextPageSelector(): String? = throw Exception("Not used")
override fun latestUpdatesFromElement(element: Element): SManga = throw Exception("Not used")
override fun latestUpdatesRequest(page: Int): Request = throw Exception("Not used")
override fun latestUpdatesSelector(): String = throw Exception("Not used")
override fun popularMangaNextPageSelector() = null
override fun popularMangaFromElement(element: Element): SManga {
val manga = SManga.create()
element.select("a").first().let {
manga.setUrlWithoutDomain(it.attr("href"))
manga.title = it.attr("title")
}
element.select("img").first()?.let {
manga.thumbnail_url = it.absUrl("src").substringBefore("?resize").substringBefore("?fit")
}
return manga
}
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
return GET("$baseUrl/?s=$query&post_type=wp-manga", headers)
}
override fun searchMangaSelector() = "div.post-title"
override fun searchMangaFromElement(element: Element): SManga {
val manga = SManga.create()
element.select("a").first().let {
manga.setUrlWithoutDomain(it.attr("href"))
manga.title = it.text()
}
element.select("img").first()?.let {
manga.thumbnail_url = it.absUrl("src").substringBefore("?resize").substringBefore("?fit")
}
return manga
}
override fun searchMangaNextPageSelector() = null
override fun mangaDetailsParse(document: Document): SManga {
val infoElement = document.select("div.tab-summary").first()
val manga = SManga.create()
manga.author = infoElement.select("div.author-content a")?.first()?.text()
manga.artist = infoElement.select("div.artist-content a")?.first()?.text()
manga.genre = infoElement.select("div.genres-content a")?.first()?.text()
var genres = mutableListOf<String>()
infoElement.select("div.genres-content a").orEmpty().forEach { id ->
genres.add(id.text())
}
manga.genre = genres.joinToString(", ")
manga.description = document.select("div.summary__content")?.first()?.text()
manga.status = document.select("div.post-status div.post-content_item:contains(status) div.summary-content").first()?.text().orEmpty().let { parseStatus(it) }
manga.thumbnail_url = document.select("div.summary_image img")?.first()?.absUrl("src")?.substringBefore("?resize")?.substringBefore("?fit")
return manga
}
private fun parseStatus(status: String) = when {
status.contains("Ongoing", true) -> SManga.ONGOING
status.contains("Completed", true) -> SManga.COMPLETED
else -> SManga.UNKNOWN
}
override fun chapterListSelector() = "div.listing-chapters_wrap li.wp-manga-chapter"
override fun chapterFromElement(element: Element): SChapter {
val urlElement = element.select("a").first()
val dateElement = element.select("span").first()
val chapter = SChapter.create()
chapter.setUrlWithoutDomain(getUrl(urlElement))
chapter.name = urlElement.text()
chapter.date_upload = dateElement.text()?.let { parseChapterDate(it) } ?: 0
return chapter
}
private fun getUrl(urlElement: Element): String {
var url = urlElement.attr("href")
return when {
url.endsWith("?style=list") -> url
else -> "$url?style=list"
}
}
open fun parseChapterDate(date: String): Long? {
val lcDate = date.toLowerCase()
if (lcDate.endsWith(" ago"))
parseRelativeDate(lcDate)?.let { return it }
//Handle 'yesterday' and 'today', using midnight
var relativeDate: Calendar? = null
if (lcDate.startsWith("yesterday")) {
relativeDate = Calendar.getInstance()
relativeDate.add(Calendar.DAY_OF_MONTH, -1) //yesterday
relativeDate.set(Calendar.HOUR_OF_DAY, 0)
relativeDate.set(Calendar.MINUTE, 0)
relativeDate.set(Calendar.SECOND, 0)
relativeDate.set(Calendar.MILLISECOND, 0)
} else if (lcDate.startsWith("today")) {
relativeDate = Calendar.getInstance()
relativeDate.set(Calendar.HOUR_OF_DAY, 0)
relativeDate.set(Calendar.MINUTE, 0)
relativeDate.set(Calendar.SECOND, 0)
relativeDate.set(Calendar.MILLISECOND, 0)
}
relativeDate?.timeInMillis?.let {
return it
}
return DATE_FORMAT_1.parse(date).time
}
/**
* Parses dates in this form:
* `11 days ago`
*/
private fun parseRelativeDate(date: String): Long? {
val trimmedDate = date.split(" ")
if (trimmedDate[2] != "ago") return null
val number = trimmedDate[0].toIntOrNull() ?: return null
val unit = trimmedDate[1].removeSuffix("s") // Remove 's' suffix
val now = Calendar.getInstance()
// Map English unit to Java unit
val javaUnit = when (unit) {
"year", "yr" -> Calendar.YEAR
"month" -> Calendar.MONTH
"week", "wk" -> Calendar.WEEK_OF_MONTH
"day" -> Calendar.DAY_OF_MONTH
"hour", "hr" -> Calendar.HOUR
"minute", "min" -> Calendar.MINUTE
"second", "sec" -> Calendar.SECOND
else -> return null
}
now.add(javaUnit, -number)
return now.timeInMillis
}
override fun pageListParse(document: Document): List<Page> {
val doc = document.select("div.page-break img")
val pages = mutableListOf<Page>()
doc.forEach {
// Create dummy element to resolve relative URL
val absUrl = it.select("img").attr("src")
pages.add(Page(pages.size, "", absUrl))
}
return pages
}
override fun imageUrlParse(document: Document) = throw UnsupportedOperationException("Not used")
companion object {
private val DATE_FORMAT_1 = SimpleDateFormat("MMM dd, yyyy", Locale.US)
}
}

View File

@ -1,20 +0,0 @@
package eu.kanade.tachiyomi.extension.all.wpmanga
import eu.kanade.tachiyomi.source.Source
import eu.kanade.tachiyomi.source.SourceFactory
class WpMangaFactory : SourceFactory {
override fun createSources(): List<Source> = getAllWpManga()
}
fun getAllWpManga(): List<Source> {
return listOf(
TrashScanlations(),
ZeroScans()
)
}
class TrashScanlations : WpManga("Trash Scanlations", "https://trashscanlations.com/", "en")
class ZeroScans : WpManga("Zero Scans", "https://zeroscans.com/", "en")

View File

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 5.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 8.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 14 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 22 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 26 KiB

View File

@ -1,132 +0,0 @@
package eu.kanade.tachiyomi.extension.en.mangazuki
import eu.kanade.tachiyomi.network.GET
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.online.ParsedHttpSource
import okhttp3.Request
import org.jsoup.nodes.Document
import org.jsoup.nodes.Element
import org.jsoup.select.Elements
import rx.Observable
import java.text.ParseException
import java.text.SimpleDateFormat
import java.util.Date
import java.util.Locale
class Mangazuki : ParsedHttpSource() {
override val name = "Mangazuki"
override val baseUrl = "https://mangazuki.co"
override val lang = "en"
override val supportsLatest = true
private val dateFormat = SimpleDateFormat("d MMM yyyy", Locale.ENGLISH)
override fun popularMangaSelector() = "div.col-sm-6"
override fun latestUpdatesSelector() = "div.timeline > dl > dd"
override fun popularMangaRequest(page: Int): Request {
return GET("$baseUrl/filterList?page=$page&cat=&alpha=&sortBy=name&asc=true&author=&tag=", headers)
}
override fun latestUpdatesRequest(page: Int): Request {
return GET("$baseUrl/latest-release", headers)
}
override fun popularMangaFromElement(element: Element): SManga {
return mangaFromElement("a.chart-title", element)
}
override fun latestUpdatesFromElement(element: Element): SManga {
return mangaFromElement("h3.events-heading > a", element)
}
private fun mangaFromElement(query: String, element: Element): SManga {
val manga = SManga.create()
element.select(query).first().let {
manga.setUrlWithoutDomain(it.attr("href"))
manga.title = it.text()
}
manga.thumbnail_url = element.select("img").first().attr("src")
return manga
}
override fun popularMangaNextPageSelector() = ".pagination .active + li:not(.disabled)"
override fun latestUpdatesNextPageSelector() = popularMangaNextPageSelector()
// Search doesn't work on the site
override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable<MangasPage> = Observable.empty()
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request = throw Exception("Not used")
override fun searchMangaSelector() = throw Exception("Not used")
override fun searchMangaFromElement(element: Element): SManga = throw Exception("Not used")
override fun searchMangaNextPageSelector() = throw Exception("Not used")
override fun mangaDetailsParse(document: Document): SManga {
val commonPath = "div.container > div:nth-of-type(3) > div"
val infoElement = document.select("$commonPath > div:nth-of-type(1) div.widget-container > dl > *")
val manga = SManga.create()
manga.author = infoElement.getDetail("Author")
manga.artist = infoElement.getDetail("Artist")
manga.genre = infoElement.getDetail("Categories").replace(Regex("\\s+,\\s+"),", ")
manga.description = document.select("$commonPath > div:nth-of-type(2) > div > div.widget-container > p").text()
manga.status = parseStatus(infoElement.getDetail("Status"))
manga.thumbnail_url = document.select("div.boxed > img.img-responsive").first().attr("src")
return manga
}
private fun Elements.getDetail(field: String): String {
for (e in this) {
if (e.text().contains(field)) {
return e.nextElementSibling().text()
}
}
return "Unknown"
}
private fun parseStatus(status: String) = when (status) {
"Ongoing" -> SManga.ONGOING
"Complete" -> SManga.COMPLETED
else -> SManga.UNKNOWN
}
override fun chapterListSelector() = "ul.chapters > li"
override fun chapterFromElement(element: Element): SChapter {
val urlElement = element.select("h3.chapter-title-rtl > a")
val chapter = SChapter.create()
chapter.setUrlWithoutDomain(urlElement.attr("href"))
chapter.name = urlElement.text()
chapter.date_upload = parseDateFromElement(element.select("div.date-chapter-title-rtl").first())
return chapter
}
private fun parseDateFromElement(dateElement: Element): Long {
val dateAsString = dateElement.text().filterNot { it == '.'}
val date: Date
try {
date = dateFormat.parse(dateAsString)
} catch (e: ParseException) {
return 0
}
return date.time
}
override fun pageListParse(document: Document) = document.select("div#all > img").mapIndexed { i, element -> Page(i, "", element.attr("data-src")) }
override fun imageUrlParse(document: Document) = ""
}

View File

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

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 3.9 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 7.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 12 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 48 KiB

View File

@ -1,151 +0,0 @@
package eu.kanade.tachiyomi.extension.en.shoujosense
import eu.kanade.tachiyomi.network.GET
import eu.kanade.tachiyomi.network.POST
import eu.kanade.tachiyomi.source.model.*
import eu.kanade.tachiyomi.source.online.ParsedHttpSource
import okhttp3.FormBody
import okhttp3.OkHttpClient
import okhttp3.Request
import okhttp3.Response
import org.jsoup.nodes.Document
import org.jsoup.nodes.Element
import java.text.ParseException
import java.text.SimpleDateFormat
import java.util.Calendar
import java.util.regex.Pattern
class ShoujoSense : ParsedHttpSource() {
override val name = "ShoujoSense"
override val baseUrl = "http://reader.shoujosense.com"
override val lang = "en"
override val supportsLatest = true
override val client: OkHttpClient = network.cloudflareClient
companion object {
val dateFormat by lazy {
SimpleDateFormat("yyyy.MM.dd")
}
val pagesUrlPattern by lazy {
Pattern.compile("""\"url\":\"(.*?)\"""")
}
}
override fun popularMangaSelector() = "div.list > div.group > div.title > a"
override fun latestUpdatesSelector() = popularMangaSelector()
override fun popularMangaRequest(page: Int)
= GET("$baseUrl/directory/$page", headers)
override fun latestUpdatesRequest(page: Int)
= GET("$baseUrl/latest/$page", headers)
override fun popularMangaFromElement(element: Element): SManga {
val manga = SManga.create()
manga.setUrlWithoutDomain(element.attr("href"))
manga.title = element.text().trim()
return manga
}
override fun latestUpdatesFromElement(element: Element): SManga {
return popularMangaFromElement(element)
}
override fun popularMangaNextPageSelector() = "div.next > a:contains(Next »)"
override fun latestUpdatesNextPageSelector() = popularMangaNextPageSelector()
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
val form = FormBody.Builder().apply {
add("search", query)
}
return POST("$baseUrl/search", headers, form.build())
}
override fun searchMangaSelector() = popularMangaSelector()
override fun searchMangaFromElement(element: Element): SManga {
return popularMangaFromElement(element)
}
override fun searchMangaNextPageSelector() = null
override fun mangaDetailsParse(document: Document): SManga {
val infoElement = document.select("div.info").first()
val manga = SManga.create()
manga.author = infoElement.select("b:contains(Author)").first()?.nextSibling()?.toString()?.substringAfterLast(": ")
// ShoujoSense does not have genre tags
manga.genre = ""
manga.description = infoElement.select("b:contains(Synopsis)").first()?.nextSibling()?.toString()?.substringAfterLast(": ")
manga.status = SManga.UNKNOWN
manga.thumbnail_url = infoElement.select("img").attr("src")
return manga
}
fun parseStatus(status: String) = when {
status.contains("Ongoing") -> SManga.ONGOING
status.contains("Completed") -> SManga.COMPLETED
else -> SManga.UNKNOWN
}
override fun chapterListSelector() = "div.list div.element"
override fun chapterFromElement(element: Element): SChapter {
val urlElement = element.select("a").first()
val chapter = SChapter.create()
chapter.setUrlWithoutDomain(urlElement.attr("href"))
chapter.name = urlElement.text()
chapter.date_upload = element.select("div.meta_r").text()?.substringAfterLast(", ")?.let {
parseChapterDate(it)
} ?: 0
return chapter
}
private fun parseChapterDate(date: String): Long {
return if ("Today" in date) {
Calendar.getInstance().timeInMillis
} else if ("Yesterday" in date) {
Calendar.getInstance().apply {
add(Calendar.DAY_OF_YEAR, -1)
}.timeInMillis
} else {
try {
dateFormat.parse(date).time
} catch (e: ParseException) {
0L
}
}
}
override fun pageListRequest(chapter: SChapter) = POST(baseUrl + chapter.url, headers)
override fun pageListParse(response: Response): List<Page> {
val body = response.body()!!.string()
val pages = mutableListOf<Page>()
val p = pagesUrlPattern
val m = p.matcher(body)
var i = 0
while (m.find()) {
val url = m.group(1)
pages.add(Page(i++, "", url.replace("""\\""", "/")))
}
return pages
}
override fun pageListParse(document: Document): List<Page> {
throw Exception("Not used")
}
override fun imageUrlRequest(page: Page) = GET(page.url)
override fun imageUrlParse(document: Document) = ""
}