mirror of
				https://github.com/mihonapp/mihon.git
				synced 2025-11-04 08:08:55 +01:00 
			
		
		
		
	Mangachan advanced support (#1138)
* Mangachan catalogue. Add support for filtering * MangaChan add support for status
This commit is contained in:
		@@ -35,13 +35,59 @@ class Mangachan : ParsedHttpSource() {
 | 
			
		||||
        val url = if (query.isNotEmpty()) {
 | 
			
		||||
            "$baseUrl/?do=search&subaction=search&story=$query&search_start=$pageNum"
 | 
			
		||||
        } else {
 | 
			
		||||
            val filt = filters.filterIsInstance<Genre>().filter { !it.isIgnored() }
 | 
			
		||||
            if (filt.isNotEmpty()) {
 | 
			
		||||
                var genres = ""
 | 
			
		||||
                filt.forEach { genres += (if (it.isExcluded()) "-" else "") + it.id + '+' }
 | 
			
		||||
                "$baseUrl/tags/${genres.dropLast(1)}?offset=${20 * (pageNum - 1)}"
 | 
			
		||||
 | 
			
		||||
            var genres = ""
 | 
			
		||||
            var order = ""
 | 
			
		||||
            var statusParam = true
 | 
			
		||||
            var status = ""
 | 
			
		||||
            for (filter in if (filters.isEmpty()) getFilterList() else filters) {
 | 
			
		||||
                when (filter) {
 | 
			
		||||
                    is GenreList -> {
 | 
			
		||||
                        filter.state.forEach { f ->
 | 
			
		||||
                            if (!f.isIgnored()) {
 | 
			
		||||
                                genres += (if (f.isExcluded()) "-" else "") + f.id + '+'
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                    is OrderBy -> { if (filter.state!!.ascending && filter.state!!.index == 0) { statusParam = false } }
 | 
			
		||||
                    is Status ->  status = arrayOf("", "all_done", "end", "ongoing", "new_ch")[filter.state]
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
 | 
			
		||||
            if (genres.isNotEmpty()) {
 | 
			
		||||
                for (filter in filters) {
 | 
			
		||||
                    when (filter) {
 | 
			
		||||
                        is OrderBy -> {
 | 
			
		||||
                            order = if (filter.state!!.ascending) {
 | 
			
		||||
                                arrayOf("", "&n=favasc", "&n=abcdesc", "&n=chasc")[filter.state!!.index]
 | 
			
		||||
                            } else {
 | 
			
		||||
                                arrayOf("&n=dateasc", "&n=favdesc", "&n=abcasc", "&n=chdesc")[filter.state!!.index]
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                if (statusParam) {
 | 
			
		||||
                    "$baseUrl/tags/${genres.dropLast(1)}$order?offset=${20 * (pageNum - 1)}&status=$status"
 | 
			
		||||
                } else {
 | 
			
		||||
                    "$baseUrl/tags/$status/${genres.dropLast(1)}/$order?offset=${20 * (pageNum - 1)}"
 | 
			
		||||
                }
 | 
			
		||||
            } else {
 | 
			
		||||
                "$baseUrl/?do=search&subaction=search&story=$query&search_start=$pageNum"
 | 
			
		||||
                for (filter in filters) {
 | 
			
		||||
                    when (filter) {
 | 
			
		||||
                        is OrderBy -> {
 | 
			
		||||
                            order = if (filter.state!!.ascending) {
 | 
			
		||||
                                arrayOf("manga/new", "manga/new&n=favasc", "manga/new&n=abcdesc", "manga/new&n=chasc")[filter.state!!.index]
 | 
			
		||||
                            } else {
 | 
			
		||||
                                arrayOf("manga/new&n=dateasc", "mostfavorites", "catalog", "sortch")[filter.state!!.index]
 | 
			
		||||
                            }
 | 
			
		||||
                        }
 | 
			
		||||
                    }
 | 
			
		||||
                }
 | 
			
		||||
                if (statusParam) {
 | 
			
		||||
                    "$baseUrl/$order?offset=${20 * (pageNum - 1)}&status=$status"
 | 
			
		||||
                } else {
 | 
			
		||||
                    "$baseUrl/$order/$status?offset=${20 * (pageNum - 1)}"
 | 
			
		||||
                }
 | 
			
		||||
            }
 | 
			
		||||
        }
 | 
			
		||||
        return GET(url, headers)
 | 
			
		||||
@@ -160,14 +206,36 @@ class Mangachan : ParsedHttpSource() {
 | 
			
		||||
 | 
			
		||||
    override fun imageUrlParse(document: Document) = ""
 | 
			
		||||
 | 
			
		||||
    private class GenreList(genres: List<Genre>) : Filter.Group<Genre>("Тэги", genres)
 | 
			
		||||
    private class Genre(name: String, val id: String = name.replace(' ', '_')) : Filter.TriState(name)
 | 
			
		||||
    private class Status : Filter.Select<String>("Статус", arrayOf("Все", "Перевод завершен", "Выпуск завершен", "Онгоинг", "Новые главы"))
 | 
			
		||||
    private class OrderBy : Filter.Sort("Сортировка",
 | 
			
		||||
            arrayOf("Дата", "Популярность", "Имя", "Главы"),
 | 
			
		||||
            Filter.Sort.Selection(1, false))
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    override fun getFilterList() = FilterList(
 | 
			
		||||
            Status(),
 | 
			
		||||
            OrderBy(),
 | 
			
		||||
            GenreList(getGenreList())
 | 
			
		||||
    )
 | 
			
		||||
 | 
			
		||||
//    private class StatusList(status: List<Status>) : Filter.Group<Status>("Статус", status)
 | 
			
		||||
//    private class Status(name: String, val id: String) : Filter.CheckBox(name, false)
 | 
			
		||||
//    private fun getStatusList() = listOf(
 | 
			
		||||
//        Status("Перевод завершен", "/all_done"),
 | 
			
		||||
//        Status("Выпуск завершен", "/end"),
 | 
			
		||||
//        Status("Онгоинг", "/ongoing"),
 | 
			
		||||
//        Status("Новые главы", "/new_ch")
 | 
			
		||||
//    )
 | 
			
		||||
 | 
			
		||||
 | 
			
		||||
    /* [...document.querySelectorAll("li.sidetag > a:nth-child(1)")].map((el,i) =>
 | 
			
		||||
    *  { const link=el.getAttribute('href');const id=link.substr(6,link.length);
 | 
			
		||||
    *  return `Genre("${id.replace("_", " ")}")` }).join(',\n')
 | 
			
		||||
    *  on http://mangachan.me/
 | 
			
		||||
    */
 | 
			
		||||
    override fun getFilterList() = FilterList(
 | 
			
		||||
    private fun getGenreList() = listOf(
 | 
			
		||||
            Genre("18 плюс"),
 | 
			
		||||
            Genre("bdsm"),
 | 
			
		||||
            Genre("арт"),
 | 
			
		||||
@@ -211,6 +279,7 @@ class Mangachan : ParsedHttpSource() {
 | 
			
		||||
            Genre("сёдзё-ай"),
 | 
			
		||||
            Genre("сёнэн"),
 | 
			
		||||
            Genre("сёнэн-ай"),
 | 
			
		||||
            Genre("темное фэнтези"),
 | 
			
		||||
            Genre("тентакли"),
 | 
			
		||||
            Genre("трагедия"),
 | 
			
		||||
            Genre("триллер"),
 | 
			
		||||
 
 | 
			
		||||
		Reference in New Issue
	
	Block a user