Update Korean extensions (#987)
All of Korean Extensions except ManhwaHand: Update domain. (Fix #961 for S.Korea users) ------ MSM: Re-branded to ManaMoa JMana, NewToki: Support Latest
This commit is contained in:
parent
e3cdc833b7
commit
62db2f5e67
|
@ -5,7 +5,7 @@ ext {
|
||||||
appName = 'Tachiyomi: JMana'
|
appName = 'Tachiyomi: JMana'
|
||||||
pkgNameSuffix = 'ko.jmana'
|
pkgNameSuffix = 'ko.jmana'
|
||||||
extClass = '.JMana'
|
extClass = '.JMana'
|
||||||
extVersionCode = 5
|
extVersionCode = 6
|
||||||
libVersion = '1.2'
|
libVersion = '1.2'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -16,21 +16,22 @@ import java.text.SimpleDateFormat
|
||||||
**/
|
**/
|
||||||
class JMana : ParsedHttpSource() {
|
class JMana : ParsedHttpSource() {
|
||||||
override val name = "JMana"
|
override val name = "JMana"
|
||||||
override val baseUrl = "https://jmana5.com"
|
override val baseUrl = "https://mangahide.com"
|
||||||
override val lang: String = "ko"
|
override val lang: String = "ko"
|
||||||
|
override val supportsLatest = true
|
||||||
// Latest updates currently returns duplicate manga as it separates manga into chapters
|
|
||||||
override val supportsLatest = false
|
|
||||||
override val client: OkHttpClient = network.cloudflareClient
|
override val client: OkHttpClient = network.cloudflareClient
|
||||||
|
|
||||||
override fun popularMangaSelector() = "div.conts > ul > li"
|
override fun popularMangaSelector() = "div.conts > ul > li"
|
||||||
|
|
||||||
override fun popularMangaFromElement(element: Element): SManga {
|
override fun popularMangaFromElement(element: Element): SManga {
|
||||||
val linkElement = element.select("a")
|
val linkElement = element.select("a")
|
||||||
val titleElement = element.select(".titBox .price").first()
|
val titleElement = element.select(".titBox > span").first()
|
||||||
|
val link = linkElement.attr("href")
|
||||||
|
.replace(" ", "%20")
|
||||||
|
.replace(Regex("/[0-9]+(?!.*?/)"), "")
|
||||||
|
|
||||||
val manga = SManga.create()
|
val manga = SManga.create()
|
||||||
manga.setUrlWithoutDomain(linkElement.attr("href").replace(" ", "%20"))
|
manga.setUrlWithoutDomain(link)
|
||||||
manga.title = titleElement.text()
|
manga.title = titleElement.text()
|
||||||
manga.thumbnail_url = baseUrl + element.select(".imgBox img").attr("src")
|
manga.thumbnail_url = baseUrl + element.select(".imgBox img").attr("src")
|
||||||
return manga
|
return manga
|
||||||
|
@ -39,7 +40,7 @@ class JMana : ParsedHttpSource() {
|
||||||
override fun popularMangaNextPageSelector() = "div.page > ul > li"
|
override fun popularMangaNextPageSelector() = "div.page > ul > li"
|
||||||
|
|
||||||
// Do not add page parameter if page is 1 to prevent tracking.
|
// Do not add page parameter if page is 1 to prevent tracking.
|
||||||
override fun popularMangaRequest(page: Int) = GET("$baseUrl/frame/?page=${page - 1}")
|
override fun popularMangaRequest(page: Int) = GET("$baseUrl/comic_main_frame?page=${page - 1}")
|
||||||
|
|
||||||
override fun popularMangaParse(response: Response): MangasPage {
|
override fun popularMangaParse(response: Response): MangasPage {
|
||||||
val document = response.asJsoup()
|
val document = response.asJsoup()
|
||||||
|
@ -62,7 +63,7 @@ class JMana : ParsedHttpSource() {
|
||||||
override fun searchMangaFromElement(element: Element) = popularMangaFromElement(element)
|
override fun searchMangaFromElement(element: Element) = popularMangaFromElement(element)
|
||||||
override fun searchMangaNextPageSelector() = popularMangaSelector()
|
override fun searchMangaNextPageSelector() = popularMangaSelector()
|
||||||
override fun searchMangaParse(response: Response) = popularMangaParse(response)
|
override fun searchMangaParse(response: Response) = popularMangaParse(response)
|
||||||
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request = GET("$baseUrl/frame/?keyword=$query&page=${page - 1}")
|
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request = GET("$baseUrl/comic_main_frame?keyword=$query&page=${page - 1}")
|
||||||
|
|
||||||
|
|
||||||
override fun mangaDetailsParse(document: Document): SManga {
|
override fun mangaDetailsParse(document: Document): SManga {
|
||||||
|
@ -128,12 +129,11 @@ class JMana : ParsedHttpSource() {
|
||||||
return pages
|
return pages
|
||||||
}
|
}
|
||||||
|
|
||||||
// Latest not supported
|
override fun latestUpdatesSelector() = popularMangaSelector()
|
||||||
override fun latestUpdatesSelector() = throw UnsupportedOperationException("This method should not be called!")
|
override fun latestUpdatesParse(response: Response) = popularMangaParse(response)
|
||||||
|
override fun latestUpdatesFromElement(element: Element) = popularMangaFromElement(element)
|
||||||
override fun latestUpdatesFromElement(element: Element) = throw UnsupportedOperationException("This method should not be called!")
|
override fun latestUpdatesRequest(page: Int) = GET("$baseUrl/frame")
|
||||||
override fun latestUpdatesRequest(page: Int) = throw UnsupportedOperationException("This method should not be called!")
|
override fun latestUpdatesNextPageSelector() = ""
|
||||||
override fun latestUpdatesNextPageSelector() = throw UnsupportedOperationException("This method should not be called!")
|
|
||||||
|
|
||||||
|
|
||||||
//We are able to get the image URL directly from the page list
|
//We are able to get the image URL directly from the page list
|
||||||
|
|
|
@ -2,10 +2,10 @@ apply plugin: 'com.android.application'
|
||||||
apply plugin: 'kotlin-android'
|
apply plugin: 'kotlin-android'
|
||||||
|
|
||||||
ext {
|
ext {
|
||||||
appName = 'Tachiyomi: MangaShow.Me'
|
appName = 'Tachiyomi: ManaMoa (MangaShow.Me)'
|
||||||
pkgNameSuffix = 'ko.mangashowme'
|
pkgNameSuffix = 'ko.mangashowme'
|
||||||
extClass = '.MangaShowMe'
|
extClass = '.MangaShowMe'
|
||||||
extVersionCode = 7
|
extVersionCode = 8
|
||||||
libVersion = '1.2'
|
libVersion = '1.2'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -11,8 +11,7 @@ import okhttp3.Request
|
||||||
private class TextField(name: String, val key: String) : Filter.Text(name)
|
private class TextField(name: String, val key: String) : Filter.Text(name)
|
||||||
private class SearchCheckBox(val id: Int, name: String) : Filter.CheckBox(name)
|
private class SearchCheckBox(val id: Int, name: String) : Filter.CheckBox(name)
|
||||||
|
|
||||||
private class SearchFieldMatch : Filter.Select<String>("Search Match", arrayOf("Not Set", "AND", "OR"))
|
private class SearchMatch : Filter.Select<String>("Match", arrayOf("AND", "OR"))
|
||||||
private class SearchTagMatch : Filter.Select<String>("Tag Match", arrayOf("AND", "OR"))
|
|
||||||
private class SearchGenresList(genres: List<SearchCheckBox>) : Filter.Group<SearchCheckBox>("Genres", genres)
|
private class SearchGenresList(genres: List<SearchCheckBox>) : Filter.Group<SearchCheckBox>("Genres", genres)
|
||||||
private class SearchNamingList : Filter.Select<String>("Naming", searchNaming())
|
private class SearchNamingList : Filter.Select<String>("Naming", searchNaming())
|
||||||
private class SearchStatusList : Filter.Select<String>("Status", searchStatus())
|
private class SearchStatusList : Filter.Select<String>("Status", searchStatus())
|
||||||
|
@ -93,41 +92,22 @@ fun getFilters() = FilterList(
|
||||||
SearchStatusList(),
|
SearchStatusList(),
|
||||||
SearchGenresList(searchGenres()),
|
SearchGenresList(searchGenres()),
|
||||||
Filter.Separator(),
|
Filter.Separator(),
|
||||||
SearchFieldMatch(),
|
SearchMatch(),
|
||||||
SearchTagMatch(),
|
|
||||||
Filter.Separator(),
|
Filter.Separator(),
|
||||||
TextField("Author/Artist (Exact Search)", "author")
|
TextField("Author/Artist (Exact Search)", "author")
|
||||||
)
|
)
|
||||||
|
|
||||||
fun searchComplexFilterMangaRequestBuilder(baseUrl: String, page: Int, query: String, filters: FilterList): Request {
|
fun searchComplexFilterMangaRequestBuilder(baseUrl: String, page: Int, query: String, filters: FilterList): Request {
|
||||||
// normal search function.
|
|
||||||
fun normalSearch(state: Int = 0): Request {
|
|
||||||
val url = HttpUrl.parse("$baseUrl/bbs/search.php?url=$baseUrl/bbs/search.php")!!.newBuilder()
|
|
||||||
|
|
||||||
if (state > 0) {
|
|
||||||
url.addQueryParameter("sop", arrayOf("and", "or")[state - 1])
|
|
||||||
}
|
|
||||||
|
|
||||||
url.addQueryParameter("stx", query)
|
|
||||||
|
|
||||||
if (page > 1) {
|
|
||||||
url.addQueryParameter("page", "${page - 1}")
|
|
||||||
}
|
|
||||||
|
|
||||||
return GET(url.toString())
|
|
||||||
}
|
|
||||||
|
|
||||||
var nameFilter: Int? = null
|
var nameFilter: Int? = null
|
||||||
var statusFilter: Int? = null
|
var statusFilter: Int? = null
|
||||||
val genresFilter = mutableListOf<String>()
|
val genresFilter = mutableListOf<String>()
|
||||||
var matchFieldFilter = 0
|
var matchFilter = 1
|
||||||
var matchTagFilter = 1
|
|
||||||
var authorFilter: String? = null
|
var authorFilter: String? = null
|
||||||
|
|
||||||
filters.forEach { filter ->
|
filters.forEach { filter ->
|
||||||
when (filter) {
|
when (filter) {
|
||||||
is SearchFieldMatch -> {
|
is SearchMatch -> {
|
||||||
matchFieldFilter = filter.state
|
matchFilter = filter.state
|
||||||
}
|
}
|
||||||
|
|
||||||
is TextField -> {
|
is TextField -> {
|
||||||
|
@ -144,12 +124,6 @@ fun searchComplexFilterMangaRequestBuilder(baseUrl: String, page: Int, query: St
|
||||||
|
|
||||||
filters.forEach { filter ->
|
filters.forEach { filter ->
|
||||||
when (filter) {
|
when (filter) {
|
||||||
is SearchTagMatch -> {
|
|
||||||
if (filter.state > 0) {
|
|
||||||
matchTagFilter = filter.state + 1
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
is SearchNamingList -> {
|
is SearchNamingList -> {
|
||||||
if (filter.state > 0) {
|
if (filter.state > 0) {
|
||||||
nameFilter = filter.state - 1
|
nameFilter = filter.state - 1
|
||||||
|
@ -172,17 +146,13 @@ fun searchComplexFilterMangaRequestBuilder(baseUrl: String, page: Int, query: St
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// If Query is over 2 length, just go to normal search
|
if (query.isEmpty() && nameFilter == null && statusFilter == null && genresFilter.isEmpty()) {
|
||||||
if (query.length > 1) {
|
|
||||||
return normalSearch(matchFieldFilter)
|
|
||||||
}
|
|
||||||
|
|
||||||
if (nameFilter == null && statusFilter == null && genresFilter.isEmpty()) {
|
|
||||||
return GET("$baseUrl/bbs/page.php?hid=manga_list")
|
return GET("$baseUrl/bbs/page.php?hid=manga_list")
|
||||||
}
|
}
|
||||||
|
|
||||||
val url = HttpUrl.parse("$baseUrl/bbs/page.php?hid=manga_list")!!.newBuilder()
|
val url = HttpUrl.parse("$baseUrl/bbs/page.php?hid=manga_list")!!.newBuilder()
|
||||||
url.addQueryParameter("search_type", matchTagFilter.toString())
|
url.addQueryParameter("search_type", matchFilter.toString())
|
||||||
|
url.addQueryParameter("_0", query)
|
||||||
url.addQueryParameter("_1", nameFilter?.toString() ?: "")
|
url.addQueryParameter("_1", nameFilter?.toString() ?: "")
|
||||||
url.addQueryParameter("_2", statusFilter?.toString() ?: "")
|
url.addQueryParameter("_2", statusFilter?.toString() ?: "")
|
||||||
url.addQueryParameter("_3", genresFilter.joinToString(","))
|
url.addQueryParameter("_3", genresFilter.joinToString(","))
|
||||||
|
|
|
@ -7,6 +7,7 @@ import android.graphics.Rect
|
||||||
import eu.kanade.tachiyomi.network.GET
|
import eu.kanade.tachiyomi.network.GET
|
||||||
import okhttp3.*
|
import okhttp3.*
|
||||||
import java.io.ByteArrayOutputStream
|
import java.io.ByteArrayOutputStream
|
||||||
|
import java.io.IOException
|
||||||
import java.io.InputStream
|
import java.io.InputStream
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -60,7 +61,7 @@ internal class ImageDecoderInterceptor : Interceptor {
|
||||||
response.newBuilder().body(rb).build()
|
response.newBuilder().body(rb).build()
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
e.printStackTrace()
|
e.printStackTrace()
|
||||||
chain.proceed(req)
|
throw IOException("Image decoder failure.", e)
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
chain.proceed(req)
|
chain.proceed(req)
|
||||||
|
|
|
@ -23,8 +23,8 @@ import java.util.concurrent.TimeUnit
|
||||||
* `manga_list` returns latest 'added' manga. not a chapter updates.
|
* `manga_list` returns latest 'added' manga. not a chapter updates.
|
||||||
**/
|
**/
|
||||||
class MangaShowMe : ParsedHttpSource() {
|
class MangaShowMe : ParsedHttpSource() {
|
||||||
override val name = "MangaShow.Me"
|
override val name = "ManaMoa (MangaShow.Me)"
|
||||||
override val baseUrl = "https://mangashow5.me"
|
override val baseUrl = "https://manamoa.net"
|
||||||
override val lang: String = "ko"
|
override val lang: String = "ko"
|
||||||
|
|
||||||
// Latest updates currently returns duplicate manga as it separates manga into chapters
|
// Latest updates currently returns duplicate manga as it separates manga into chapters
|
||||||
|
@ -68,7 +68,7 @@ class MangaShowMe : ParsedHttpSource() {
|
||||||
|
|
||||||
val manga = SManga.create()
|
val manga = SManga.create()
|
||||||
manga.url = urlTitleEscape(linkElement.attr("href"))
|
manga.url = urlTitleEscape(linkElement.attr("href"))
|
||||||
manga.title = titleElement.text()
|
manga.title = titleElement.text().trim()
|
||||||
manga.thumbnail_url = urlFinder(element.select(".img-wrap-back").attr("style"))
|
manga.thumbnail_url = urlFinder(element.select(".img-wrap-back").attr("style"))
|
||||||
return manga
|
return manga
|
||||||
}
|
}
|
||||||
|
@ -211,13 +211,6 @@ class MangaShowMe : ParsedHttpSource() {
|
||||||
|
|
||||||
(0 until imageUrls.length())
|
(0 until imageUrls.length())
|
||||||
.map { imageUrls.getString(it) }
|
.map { imageUrls.getString(it) }
|
||||||
.map {
|
|
||||||
val curr = ".mangashow5.me"
|
|
||||||
it
|
|
||||||
.replace(".mangashow.me", curr)
|
|
||||||
.replace(".mangashow2.me", curr)
|
|
||||||
.replace(".mangashow3.me", curr)
|
|
||||||
}
|
|
||||||
.forEach { pages.add(Page(pages.size, "", decoder.request(it))) }
|
.forEach { pages.add(Page(pages.size, "", decoder.request(it))) }
|
||||||
} catch (e: Exception) {
|
} catch (e: Exception) {
|
||||||
e.printStackTrace()
|
e.printStackTrace()
|
||||||
|
|
|
@ -5,7 +5,7 @@ ext {
|
||||||
appName = 'Tachiyomi: NewToki'
|
appName = 'Tachiyomi: NewToki'
|
||||||
pkgNameSuffix = 'ko.newtoki'
|
pkgNameSuffix = 'ko.newtoki'
|
||||||
extClass = '.NewToki'
|
extClass = '.NewToki'
|
||||||
extVersionCode = 5
|
extVersionCode = 6
|
||||||
libVersion = '1.2'
|
libVersion = '1.2'
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -18,28 +18,10 @@ import java.util.*
|
||||||
**/
|
**/
|
||||||
class NewToki : ParsedHttpSource() {
|
class NewToki : ParsedHttpSource() {
|
||||||
override val name = "NewToki"
|
override val name = "NewToki"
|
||||||
override val baseUrl = "https://newtoki3.net"
|
override val baseUrl = "https://newtoki7.net"
|
||||||
override val lang: String = "ko"
|
override val lang: String = "ko"
|
||||||
|
override val supportsLatest = true
|
||||||
// Latest updates currently returns duplicate manga as it separates manga into chapters
|
override val client: OkHttpClient = network.cloudflareClient
|
||||||
override val supportsLatest = false
|
|
||||||
override val client: OkHttpClient = network.cloudflareClient.newBuilder()
|
|
||||||
.addInterceptor { chain ->
|
|
||||||
val req = chain.request()
|
|
||||||
var res: Response? = null
|
|
||||||
|
|
||||||
for (_i in 0..10) {
|
|
||||||
try {
|
|
||||||
res = chain.proceed(req)
|
|
||||||
} catch (e: javax.net.ssl.SSLHandshakeException) {
|
|
||||||
if (e.message!!.contains("Connection reset by peer")) continue
|
|
||||||
}
|
|
||||||
break
|
|
||||||
}
|
|
||||||
|
|
||||||
res ?: chain.proceed(req)
|
|
||||||
}
|
|
||||||
.build()!!
|
|
||||||
|
|
||||||
|
|
||||||
override fun popularMangaSelector() = "div#webtoon-list > ul > li"
|
override fun popularMangaSelector() = "div#webtoon-list > ul > li"
|
||||||
|
@ -192,12 +174,11 @@ class NewToki : ParsedHttpSource() {
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
// Latest not supported
|
override fun latestUpdatesSelector() = popularMangaSelector()
|
||||||
override fun latestUpdatesSelector() = throw UnsupportedOperationException("This method should not be called!")
|
override fun latestUpdatesFromElement(element: Element) = popularMangaFromElement(element)
|
||||||
|
override fun latestUpdatesRequest(page: Int) = popularMangaRequest(page)
|
||||||
override fun latestUpdatesFromElement(element: Element) = throw UnsupportedOperationException("This method should not be called!")
|
override fun latestUpdatesNextPageSelector() = popularMangaNextPageSelector()
|
||||||
override fun latestUpdatesRequest(page: Int) = throw UnsupportedOperationException("This method should not be called!")
|
override fun latestUpdatesParse(response: Response) = popularMangaParse(response)
|
||||||
override fun latestUpdatesNextPageSelector() = throw UnsupportedOperationException("This method should not be called!")
|
|
||||||
|
|
||||||
|
|
||||||
//We are able to get the image URL directly from the page list
|
//We are able to get the image URL directly from the page list
|
||||||
|
|
Loading…
Reference in New Issue