diff --git a/src/ko/jmana/build.gradle b/src/ko/jmana/build.gradle index 26750e9eb..b5bdcb968 100644 --- a/src/ko/jmana/build.gradle +++ b/src/ko/jmana/build.gradle @@ -5,7 +5,7 @@ ext { appName = 'Tachiyomi: JMana' pkgNameSuffix = 'ko.jmana' extClass = '.JMana' - extVersionCode = 2 + extVersionCode = 3 libVersion = '1.2' } diff --git a/src/ko/jmana/src/eu/kanade/tachiyomi/extension/ko/jmana/JMana.kt b/src/ko/jmana/src/eu/kanade/tachiyomi/extension/ko/jmana/JMana.kt index 039563883..6c1a3144b 100644 --- a/src/ko/jmana/src/eu/kanade/tachiyomi/extension/ko/jmana/JMana.kt +++ b/src/ko/jmana/src/eu/kanade/tachiyomi/extension/ko/jmana/JMana.kt @@ -15,7 +15,7 @@ import org.jsoup.nodes.Element **/ class JMana : ParsedHttpSource() { override val name = "JMana" - override val baseUrl = "https://www.jmana2.com" + override val baseUrl = "https://jmana1.com" override val lang: String = "ko" // Latest updates currently returns duplicate manga as it separates manga into chapters @@ -29,7 +29,7 @@ class JMana : ParsedHttpSource() { val titleElement = element.select(".titBox .price").first() val manga = SManga.create() - manga.setUrlWithoutDomain(linkElement.attr("href")) + manga.setUrlWithoutDomain(linkElement.attr("href").replace(" ", "%20")) manga.title = titleElement.text() manga.thumbnail_url = baseUrl + element.select(".imgBox img").attr("src") return manga @@ -38,7 +38,7 @@ class JMana : ParsedHttpSource() { override fun popularMangaNextPageSelector() = "div.page > ul > li" // Do not add page parameter if page is 1 to prevent tracking. - override fun popularMangaRequest(page: Int) = GET(baseUrl + if (page > 1) "/?page=${page - 1}" else "") + override fun popularMangaRequest(page: Int) = GET("$baseUrl/frame/?page=${page - 1}") override fun popularMangaParse(response: Response): MangasPage { val document = response.asJsoup() @@ -61,7 +61,7 @@ class JMana : ParsedHttpSource() { override fun searchMangaFromElement(element: Element) = popularMangaFromElement(element) override fun searchMangaNextPageSelector() = popularMangaSelector() override fun searchMangaParse(response: Response) = popularMangaParse(response) - override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request = GET("$baseUrl/?keyword=$query" + if (page > 1) "&page=${page - 1}" else "") + override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request = GET("$baseUrl/frame/?keyword=$query&page=${page - 1}") override fun mangaDetailsParse(document: Document): SManga { @@ -84,7 +84,7 @@ class JMana : ParsedHttpSource() { val rawName = linkElement.text() val chapter = SChapter.create() - chapter.url = linkElement.attr("href") + chapter.url = linkElement.attr("href").replace("book/", "book_frame/") chapter.chapter_number = parseChapterNumber(rawName) chapter.name = rawName.trim() return chapter @@ -117,7 +117,6 @@ class JMana : ParsedHttpSource() { return pages } - // Latest not supported override fun latestUpdatesSelector() = throw UnsupportedOperationException("This method should not be called!") diff --git a/src/ko/mangashowme/build.gradle b/src/ko/mangashowme/build.gradle index 1ef6339fc..149c73edd 100644 --- a/src/ko/mangashowme/build.gradle +++ b/src/ko/mangashowme/build.gradle @@ -5,7 +5,7 @@ ext { appName = 'Tachiyomi: MangaShow.Me' pkgNameSuffix = 'ko.mangashowme' extClass = '.MangaShowMe' - extVersionCode = 3 + extVersionCode = 4 libVersion = '1.2' } diff --git a/src/ko/mangashowme/src/eu/kanade/tachiyomi/extension/ko/mangashowme/MSMFilters.kt b/src/ko/mangashowme/src/eu/kanade/tachiyomi/extension/ko/mangashowme/MSMFilters.kt index 9e4776b47..8ed6d8418 100644 --- a/src/ko/mangashowme/src/eu/kanade/tachiyomi/extension/ko/mangashowme/MSMFilters.kt +++ b/src/ko/mangashowme/src/eu/kanade/tachiyomi/extension/ko/mangashowme/MSMFilters.kt @@ -8,48 +8,50 @@ import okhttp3.Request // TODO: Completely Implement/Update Filters(Genre/Artist). -// 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 SearchFieldMatch : Filter.Select<String>("Search Match", arrayOf("Not Set", "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 SearchNamingList(naming: List<SearchCheckBox>) : Filter.Group<SearchCheckBox>("Naming", naming) -private class SearchStatusList(status: List<SearchCheckBox>) : Filter.Group<SearchCheckBox>("Status", status) +private class SearchNamingList : Filter.Select<String>("Naming", searchNaming()) +private class SearchStatusList : Filter.Select<String>("Status", searchStatus()) -private fun searchNaming() = listOf( - SearchCheckBox(0, "ㄱ"), - SearchCheckBox(1, "ㄲ"), - SearchCheckBox(2, "ㄴ"), - SearchCheckBox(3, "ㄷ"), - SearchCheckBox(4, "ㄸ"), - SearchCheckBox(5, "ㄹ"), - SearchCheckBox(6, "ㅁ"), - SearchCheckBox(7, "ㅂ"), - SearchCheckBox(8, "ㅃ"), - SearchCheckBox(9, "ㅅ"), - SearchCheckBox(10, "ㅆ"), - SearchCheckBox(11, "ㅇ"), - SearchCheckBox(12, "ㅈ"), - SearchCheckBox(13, "ㅉ"), - SearchCheckBox(14, "ㅊ"), - SearchCheckBox(15, "ㅋ"), - SearchCheckBox(16, "ㅌ"), - SearchCheckBox(17, "ㅍ"), - SearchCheckBox(18, "ㅎ"), - SearchCheckBox(19, "A-Z"), - SearchCheckBox(20, "0-9") +private fun searchNaming() = arrayOf( + "Not Set", + "ㄱ", + "ㄲ", + "ㄴ", + "ㄷ", + "ㄸ", + "ㄹ", + "ㅁ", + "ㅂ", + "ㅃ", + "ㅅ", + "ㅆ", + "ㅇ", + "ㅈ", + "ㅉ", + "ㅊ", + "ㅋ", + "ㅌ", + "ㅍ", + "ㅎ", + "A-Z", + "0-9" ) -private fun searchStatus() = listOf( - SearchCheckBox(0, "미분류"), - SearchCheckBox(1, "주간"), - SearchCheckBox(2, "격주"), - SearchCheckBox(3, "월간"), - SearchCheckBox(4, "격월/비정기"), - SearchCheckBox(5, "단편"), - SearchCheckBox(6, "단행본"), - SearchCheckBox(7, "완결") +private fun searchStatus() = arrayOf( + "Not Set", + "미분류", + "주간", + "격주", + "월간", + "격월/비정기", + "단편", + "단행본", + "완결" ) private fun searchGenres() = listOf( @@ -87,14 +89,14 @@ private fun searchGenres() = listOf( ) fun getFilters() = FilterList( - SearchNamingList(searchNaming()), - SearchStatusList(searchStatus()), + SearchNamingList(), + SearchStatusList(), SearchGenresList(searchGenres()), Filter.Separator(), SearchFieldMatch(), - SearchTagMatch() - //Filter.Separator(), - //TextField("Author/Artist (Accurate full name)", "author") + SearchTagMatch(), + Filter.Separator(), + TextField("Author/Artist (Exact Search)", "author") ) fun searchComplexFilterMangaRequestBuilder(baseUrl: String, page: Int, query: String, filters: FilterList): Request { @@ -115,20 +117,31 @@ fun searchComplexFilterMangaRequestBuilder(baseUrl: String, page: Int, query: St return GET(url.toString()) } - val nameFilter = mutableListOf<Int>() - val statusFilter = mutableListOf<Int>() + var nameFilter: Int? = null + var statusFilter: Int? = null val genresFilter = mutableListOf<String>() var matchFieldFilter = 0 var matchTagFilter = 1 + var authorFilter: String? = null filters.forEach { filter -> when (filter) { is SearchFieldMatch -> { matchFieldFilter = filter.state } + + is TextField -> { + if (filter.key == "author" && !filter.state.isEmpty()) { + authorFilter = filter.state + } + } } } + if (!authorFilter.isNullOrEmpty()) { + return GET("$baseUrl/bbs/page.php?hid=manga_list&sfl=4&stx=$authorFilter&page=${page - 1}") + } + filters.forEach { filter -> when (filter) { is SearchTagMatch -> { @@ -138,18 +151,14 @@ fun searchComplexFilterMangaRequestBuilder(baseUrl: String, page: Int, query: St } is SearchNamingList -> { - filter.state.forEach { - if (it.state) { - nameFilter.add(it.id) - } + if (filter.state > 0) { + nameFilter = filter.state - 1 } } is SearchStatusList -> { - filter.state.forEach { - if (it.state) { - statusFilter.add(it.id) - } + if (filter.state > 0) { + statusFilter = filter.state - 1 } } @@ -160,14 +169,6 @@ fun searchComplexFilterMangaRequestBuilder(baseUrl: String, page: Int, query: St } } } - -// is TextField -> { -// if (type == 4 && filter.key == "author") { -// if (filter.key.length > 1) { -// return GET("$baseUrl/bbs/page.php?hid=manga_list&sfl=4&stx=${filter.state}") -// } -// } -// } } } @@ -176,14 +177,14 @@ fun searchComplexFilterMangaRequestBuilder(baseUrl: String, page: Int, query: St return normalSearch(matchFieldFilter) } - if (nameFilter.isEmpty() && statusFilter.isEmpty() && genresFilter.isEmpty()) { + if (nameFilter == null && statusFilter == null && genresFilter.isEmpty()) { return GET("$baseUrl/bbs/page.php?hid=manga_list") } val url = HttpUrl.parse("$baseUrl/bbs/page.php?hid=manga_list")!!.newBuilder() url.addQueryParameter("search_type", matchTagFilter.toString()) - url.addQueryParameter("_1", nameFilter.joinToString(",")) - url.addQueryParameter("_2", statusFilter.joinToString(",")) + url.addQueryParameter("_1", nameFilter?.toString() ?: "") + url.addQueryParameter("_2", statusFilter?.toString() ?: "") url.addQueryParameter("_3", genresFilter.joinToString(",")) if (page > 1) { url.addQueryParameter("page", "${page - 1}") diff --git a/src/ko/mangashowme/src/eu/kanade/tachiyomi/extension/ko/mangashowme/MangaShowMe.kt b/src/ko/mangashowme/src/eu/kanade/tachiyomi/extension/ko/mangashowme/MangaShowMe.kt index a22155b90..072f97a05 100644 --- a/src/ko/mangashowme/src/eu/kanade/tachiyomi/extension/ko/mangashowme/MangaShowMe.kt +++ b/src/ko/mangashowme/src/eu/kanade/tachiyomi/extension/ko/mangashowme/MangaShowMe.kt @@ -134,7 +134,6 @@ class MangaShowMe : ParsedHttpSource() { private fun parseStatus(status: String) = when (status.trim()) { "주간", "격주", "월간", "격월/비정기", "단행본" -> SManga.ONGOING "단편", "완결" -> SManga.COMPLETED - // "미분류", "" -> SManga.UNKNOWN else -> SManga.UNKNOWN } @@ -156,7 +155,7 @@ class MangaShowMe : ParsedHttpSource() { val rawName = linkElement.select("div.title").last() val chapter = SChapter.create() - chapter.url = linkElement.attr("href") + chapter.setUrlWithoutDomain(linkElement.attr("href")) chapter.chapter_number = parseChapterNumber(rawName.text()) chapter.name = rawName.ownText().trim() chapter.date_upload = parseChapterDate(element.select("div.addedAt").text().split(" ").first()) @@ -199,7 +198,7 @@ class MangaShowMe : ParsedHttpSource() { // They are using full url in every links. // There's possibility to using another domain for serve manga(s). Like marumaru. - override fun pageListRequest(chapter: SChapter) = GET(chapter.url, headers) + //override fun pageListRequest(chapter: SChapter) = GET(chapter.url, headers) override fun pageListParse(document: Document): List<Page> { val pages = mutableListOf<Page>() diff --git a/src/ko/newtoki/build.gradle b/src/ko/newtoki/build.gradle index cdeac33d3..04f9a13cd 100644 --- a/src/ko/newtoki/build.gradle +++ b/src/ko/newtoki/build.gradle @@ -5,7 +5,7 @@ ext { appName = 'Tachiyomi: NewToki' pkgNameSuffix = 'ko.newtoki' extClass = '.NewToki' - extVersionCode = 3 + extVersionCode = 4 libVersion = '1.2' } diff --git a/src/ko/newtoki/src/eu/kanade/tachiyomi/extension/ko/newtoki/NewToki.kt b/src/ko/newtoki/src/eu/kanade/tachiyomi/extension/ko/newtoki/NewToki.kt index 4645f7cc3..a2b5ac2b2 100644 --- a/src/ko/newtoki/src/eu/kanade/tachiyomi/extension/ko/newtoki/NewToki.kt +++ b/src/ko/newtoki/src/eu/kanade/tachiyomi/extension/ko/newtoki/NewToki.kt @@ -84,21 +84,38 @@ class NewToki : ParsedHttpSource() { override fun mangaDetailsParse(document: Document): SManga { val info = document.select("div.view-title > .view-content").first() - val authorText = info.select("span.label.btn-info").text() - val title = info.select("div.view-content > span[style] > b").text() - val genres = mutableListOf<String>() - info.select("span.label.label-success").forEach { - genres.add(it.text()) + val title = document.select("div.view-content > span > b").text() + val descriptionElement = info.select("div.row div.view-content:not([style])") + val description = descriptionElement.map { + it.text().trim() } val manga = SManga.create() manga.title = title - manga.author = authorText - manga.genre = genres.joinToString(", ") - manga.status = SManga.UNKNOWN + manga.description = description.joinToString("\n") + descriptionElement.forEach { + val text = it.text() + when { + "작가" in text -> manga.author = it.getElementsByTag("a").text() + "분류" in text -> { + val genres = mutableListOf<String>() + it.getElementsByTag("a").forEach { item -> + genres.add(item.text()) + } + manga.genre = genres.joinToString(", ") + } + "발행구분" in text -> manga.status = parseStatus(it.getElementsByTag("a").text()) + } + } return manga } + private fun parseStatus(status: String) = when (status.trim()) { + "주간", "격주", "월간", "격월/비정기", "단행본" -> SManga.ONGOING + "단편", "완결" -> SManga.COMPLETED + else -> SManga.UNKNOWN + } + override fun chapterListSelector() = "div.serial-list > ul.list-body > li.list-item" override fun chapterFromElement(element: Element): SChapter {