diff --git a/src/ru/libmanga/build.gradle b/src/ru/libmanga/build.gradle index f7f541b25..102f6a398 100644 --- a/src/ru/libmanga/build.gradle +++ b/src/ru/libmanga/build.gradle @@ -5,7 +5,7 @@ ext { extName = 'MangaLib' pkgNameSuffix = 'ru.libmanga' extClass = '.LibManga' - extVersionCode = 36 + extVersionCode = 37 libVersion = '1.2' } diff --git a/src/ru/libmanga/src/eu/kanade/tachiyomi/extension/ru/libmanga/LibManga.kt b/src/ru/libmanga/src/eu/kanade/tachiyomi/extension/ru/libmanga/LibManga.kt index 3fcf0ec15..b2ccf8759 100644 --- a/src/ru/libmanga/src/eu/kanade/tachiyomi/extension/ru/libmanga/LibManga.kt +++ b/src/ru/libmanga/src/eu/kanade/tachiyomi/extension/ru/libmanga/LibManga.kt @@ -11,6 +11,7 @@ import com.github.salomonbrys.kotson.nullArray import com.github.salomonbrys.kotson.nullString import com.github.salomonbrys.kotson.obj import com.github.salomonbrys.kotson.string +import com.github.salomonbrys.kotson.toMap import com.google.gson.JsonElement import com.google.gson.JsonParser import eu.kanade.tachiyomi.network.GET @@ -298,12 +299,16 @@ class LibManga : ConfigurableSource, HttpSource() { .first() val chapInfoJson = jsonParser.parse(chapInfo).obj - val servers = chapInfoJson["servers"].asJsonObject + val servers = chapInfoJson["servers"].asJsonObject.toMap() val defaultServer: String = chapInfoJson["img"]["server"].string + val autoServer = setOf(defaultServer, "secondary", "fourth", "compress") val imgUrl: String = chapInfoJson["img"]["url"].string - val serverToUse = if (this.server == null) defaultServer else this.server - val imageServerUrl: String = servers[serverToUse].string + val serverToUse = when (this.server) { + null -> autoServer + "auto" -> autoServer + else -> listOf(this.server) + } // Get pages val pagesArr = document @@ -318,11 +323,34 @@ class LibManga : ConfigurableSource, HttpSource() { val pages = mutableListOf() pagesJson.forEach { page -> - pages.add(Page(page["p"].int, "", imageServerUrl + "/" + imgUrl + page["u"].string)) + val keys = servers.keys.filter { serverToUse.indexOf(it) >= 0 }.sortedBy { serverToUse.indexOf(it) } + val serversUrls = keys.map { + servers[it]?.string + imgUrl + page["u"].string + }.joinToString(separator = ",,") { it } + pages.add(Page(page["p"].int, serversUrls)) } + return pages } + private fun checkImage(url: String): Boolean { + val response = client.newCall(Request.Builder().url(url).head().headers(headers).build()).execute() + return response.isSuccessful && (response.header("Content-Length")?.toInt()!! > 320) + } + + override fun fetchImageUrl(page: Page): Observable { + if (page.imageUrl != null) { + return Observable.just(page.imageUrl) + } + + val urls = page.url.split(",,") + if (urls.size == 1) { + return Observable.just(urls[0]) + } + + return Observable.from(urls).filter { checkImage(it) }.first() + } + override fun imageUrlParse(response: Response): String = "" private fun searchMangaByIdRequest(id: String): Request { @@ -365,11 +393,21 @@ class LibManga : ConfigurableSource, HttpSource() { url.addQueryParameter("types[]", category.id) } } + is FormatList -> filter.state.forEach { forma -> + if (forma.state != Filter.TriState.STATE_IGNORE) { + url.addQueryParameter(if (forma.isIncluded()) "format[include][]" else "format[exclude][]", forma.id) + } + } is StatusList -> filter.state.forEach { status -> if (status.state) { url.addQueryParameter("status[]", status.id) } } + is StatusTitleList -> filter.state.forEach { title -> + if (title.state) { + url.addQueryParameter("manga_status[]", title.id) + } + } is GenreList -> filter.state.forEach { genre -> if (genre.state != Filter.TriState.STATE_IGNORE) { url.addQueryParameter(if (genre.isIncluded()) "genres[include][]" else "genres[exclude][]", genre.id) @@ -433,7 +471,9 @@ class LibManga : ConfigurableSource, HttpSource() { private class CheckFilter(name: String, val id: String) : Filter.CheckBox(name) private class CategoryList(categories: List) : Filter.Group("Тип", categories) + private class FormatList(formas: List) : Filter.Group("Формат выпуска", formas) private class StatusList(statuses: List) : Filter.Group("Статус перевода", statuses) + private class StatusTitleList(titles: List) : Filter.Group("Статус тайтла", titles) private class GenreList(genres: List) : Filter.Group("Жанры", genres) private class TagList(tags: List) : Filter.Group("Теги", tags) private class AgeList(ages: List) : Filter.Group("Возрастное ограничение", ages) @@ -441,9 +481,11 @@ class LibManga : ConfigurableSource, HttpSource() { override fun getFilterList() = FilterList( OrderBy(), CategoryList(getCategoryList()), + FormatList(getFormatList()), GenreList(getGenreList()), TagList(getTagList()), StatusList(getStatusList()), + StatusTitleList(getStatusTitleList()), AgeList(getAgeList()) ) @@ -467,6 +509,15 @@ class LibManga : ConfigurableSource, HttpSource() { CheckFilter("Комикс западный", "9") ) + private fun getFormatList() = listOf( + SearchFilter("4-кома (Ёнкома)", "1"), + SearchFilter("Сборник", "2"), + SearchFilter("Додзинси", "3"), + SearchFilter("Сингл", "4"), + SearchFilter("В цвете", "5"), + SearchFilter("Веб", "6") + ) + /* * Use console * Object.entries(__FILTER_ITEMS__.status).map(([k, v]) => `SearchFilter("${v.label}", "${v.id}")`).join(',\n') @@ -479,6 +530,14 @@ class LibManga : ConfigurableSource, HttpSource() { CheckFilter("Заброшен", "4") ) + private fun getStatusTitleList() = listOf( + CheckFilter("Онгоинг", "1"), + CheckFilter("Завершён", "2"), + CheckFilter("Анонс", "3"), + CheckFilter("Приостановлен", "4"), + CheckFilter("Выпуск прекращён", "5"), + ) + /* * Use console * __FILTER_ITEMS__.genres.map(it => `SearchFilter("${it.name}", "${it.id}")`).join(',\n') @@ -489,13 +548,11 @@ class LibManga : ConfigurableSource, HttpSource() { SearchFilter("боевик", "34"), SearchFilter("боевые искусства", "35"), SearchFilter("вампиры", "36"), - SearchFilter("веб", "78"), SearchFilter("гарем", "37"), SearchFilter("гендерная интрига", "38"), SearchFilter("героическое фэнтези", "39"), SearchFilter("детектив", "40"), SearchFilter("дзёсэй", "41"), - SearchFilter("додзинси", "42"), SearchFilter("драма", "43"), SearchFilter("ёнкома", "75"), SearchFilter("игра", "44"), @@ -533,6 +590,7 @@ class LibManga : ConfigurableSource, HttpSource() { SearchFilter("юри", "73"), SearchFilter("яой", "74") ) + private fun getTagList() = listOf( SearchFilter("Азартные игры", "304"), SearchFilter("Алхимия", "225"), @@ -639,6 +697,7 @@ class LibManga : ConfigurableSource, HttpSource() { CheckFilter("16+", "1"), CheckFilter("18+", "2") ) + companion object { const val PREFIX_SLUG_SEARCH = "slug:" private const val SERVER_PREF = "MangaLibImageServer" @@ -654,8 +713,8 @@ class LibManga : ConfigurableSource, HttpSource() { val serverPref = ListPreference(screen.context).apply { key = SERVER_PREF title = SERVER_PREF_Title - entries = arrayOf("Основной", "Второй (тестовый)", "Третий (эконом трафика)") - entryValues = arrayOf("secondary", "fourth", "compress") + entries = arrayOf("Основной", "Второй (тестовый)", "Третий (эконом трафика)", "Авто") + entryValues = arrayOf("secondary", "fourth", "compress", "auto") summary = "%s" setOnPreferenceChangeListener { _, newValue -> @@ -688,8 +747,8 @@ class LibManga : ConfigurableSource, HttpSource() { val serverPref = LegacyListPreference(screen.context).apply { key = SERVER_PREF title = SERVER_PREF_Title - entries = arrayOf("Основной", "Второй (тестовый)", "Третий (эконом трафика)") - entryValues = arrayOf("secondary", "fourth", "compress") + entries = arrayOf("Основной", "Второй (тестовый)", "Третий (эконом трафика)", "Авто") + entryValues = arrayOf("secondary", "fourth", "compress", "auto") summary = "%s" setOnPreferenceChangeListener { _, newValue ->