[RU]Manga-online.biz delete (#11981)
This commit is contained in:
parent
723bce9a5a
commit
b0de29f4ad
|
@ -1,2 +0,0 @@
|
|||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<manifest package="eu.kanade.tachiyomi.extension" />
|
|
@ -1,12 +0,0 @@
|
|||
apply plugin: 'com.android.application'
|
||||
apply plugin: 'kotlin-android'
|
||||
apply plugin: 'kotlinx-serialization'
|
||||
|
||||
ext {
|
||||
extName = 'Mangaonlinebiz'
|
||||
pkgNameSuffix = 'ru.mangaonlinebiz'
|
||||
extClass = '.MangaOnlineBiz'
|
||||
extVersionCode = 10
|
||||
}
|
||||
|
||||
apply from: "$rootDir/common.gradle"
|
Binary file not shown.
Before Width: | Height: | Size: 2.8 KiB |
Binary file not shown.
Before Width: | Height: | Size: 1.5 KiB |
Binary file not shown.
Before Width: | Height: | Size: 3.7 KiB |
Binary file not shown.
Before Width: | Height: | Size: 6.4 KiB |
Binary file not shown.
Before Width: | Height: | Size: 9.9 KiB |
Binary file not shown.
Before Width: | Height: | Size: 41 KiB |
|
@ -1,244 +0,0 @@
|
|||
package eu.kanade.tachiyomi.extension.ru.mangaonlinebiz
|
||||
|
||||
import eu.kanade.tachiyomi.network.GET
|
||||
import eu.kanade.tachiyomi.source.model.Filter
|
||||
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 kotlinx.serialization.decodeFromString
|
||||
import kotlinx.serialization.json.Json
|
||||
import kotlinx.serialization.json.JsonArray
|
||||
import kotlinx.serialization.json.JsonObject
|
||||
import kotlinx.serialization.json.float
|
||||
import kotlinx.serialization.json.jsonArray
|
||||
import kotlinx.serialization.json.jsonObject
|
||||
import kotlinx.serialization.json.jsonPrimitive
|
||||
import okhttp3.Headers
|
||||
import okhttp3.Request
|
||||
import okhttp3.Response
|
||||
import org.jsoup.nodes.Document
|
||||
import org.jsoup.nodes.Element
|
||||
import uy.kohesive.injekt.injectLazy
|
||||
import java.text.SimpleDateFormat
|
||||
import java.util.Locale
|
||||
|
||||
class MangaOnlineBiz : ParsedHttpSource() {
|
||||
|
||||
private val json: Json by injectLazy()
|
||||
|
||||
override val name = "MangaOnlineBiz"
|
||||
|
||||
override val baseUrl = "https://manga-online.biz"
|
||||
|
||||
override val lang = "ru"
|
||||
|
||||
override val supportsLatest = true
|
||||
|
||||
private val userAgent = "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.163 Safari/537.36"
|
||||
|
||||
override fun headersBuilder(): Headers.Builder = Headers.Builder()
|
||||
.add("User-Agent", userAgent)
|
||||
.add("Referer", baseUrl)
|
||||
|
||||
override fun popularMangaRequest(page: Int): Request =
|
||||
GET("$baseUrl/genre/all/page/$page", headers)
|
||||
|
||||
override fun latestUpdatesRequest(page: Int): Request =
|
||||
GET("$baseUrl/genre/all/order/new/page/$page")
|
||||
|
||||
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
|
||||
val url = if (query.isNotBlank()) {
|
||||
"$baseUrl/search-ajax/?query=$query"
|
||||
} else {
|
||||
var ret = String()
|
||||
(if (filters.isEmpty()) getFilterList() else filters).forEach { filter ->
|
||||
when (filter) {
|
||||
is GenreList -> {
|
||||
ret = "$baseUrl/genre/${filter.values[filter.state].id}/page/$page"
|
||||
}
|
||||
}
|
||||
}
|
||||
ret
|
||||
}
|
||||
return GET(url, headers)
|
||||
}
|
||||
|
||||
override fun popularMangaSelector() = "a.genre"
|
||||
|
||||
override fun latestUpdatesSelector() = popularMangaSelector()
|
||||
|
||||
override fun searchMangaParse(response: Response): MangasPage {
|
||||
if (!response.request.url.toString().contains("search-ajax")) {
|
||||
return popularMangaParse(response)
|
||||
}
|
||||
val jsonData = response.body!!.string()
|
||||
val results = json.decodeFromString<JsonObject>(jsonData)["results"]!!.jsonArray
|
||||
val mangas = mutableListOf<SManga>()
|
||||
results.forEach {
|
||||
val element = it.jsonObject
|
||||
val manga = SManga.create()
|
||||
manga.setUrlWithoutDomain(element["url"]!!.jsonPrimitive.content)
|
||||
manga.title = element["title"]!!.jsonPrimitive.content.split("/").first()
|
||||
val image = element["image"]!!.jsonPrimitive.content
|
||||
if (image.startsWith("http")) {
|
||||
manga.thumbnail_url = image
|
||||
} else {
|
||||
manga.thumbnail_url = baseUrl + image
|
||||
}
|
||||
|
||||
mangas.add(manga)
|
||||
}
|
||||
|
||||
return MangasPage(mangas, false)
|
||||
}
|
||||
|
||||
override fun popularMangaFromElement(element: Element): SManga {
|
||||
val manga = SManga.create()
|
||||
manga.thumbnail_url = element.select("img").first().attr("src")
|
||||
manga.setUrlWithoutDomain(element.attr("href"))
|
||||
element.select("div.content").first().let {
|
||||
manga.title = it.text().split("/").first()
|
||||
}
|
||||
return manga
|
||||
}
|
||||
|
||||
override fun latestUpdatesFromElement(element: Element): SManga =
|
||||
popularMangaFromElement(element)
|
||||
|
||||
override fun searchMangaFromElement(element: Element): SManga = throw Exception("Not Used")
|
||||
|
||||
override fun popularMangaNextPageSelector() = "a.button.next"
|
||||
|
||||
override fun latestUpdatesNextPageSelector() = popularMangaNextPageSelector()
|
||||
|
||||
override fun searchMangaNextPageSelector() = throw Exception("Not Used")
|
||||
|
||||
override fun mangaDetailsParse(document: Document): SManga {
|
||||
val infoElement = document.select(".items .item").first()
|
||||
val manga = SManga.create()
|
||||
manga.genre = infoElement.select("a.label").joinToString { it.text() }
|
||||
manga.description = infoElement.select(".description").text()
|
||||
manga.thumbnail_url = infoElement.select("img").first().attr("src")
|
||||
if (infoElement.text().contains("Перевод: закончен")) {
|
||||
manga.status = SManga.COMPLETED
|
||||
} else if (infoElement.text().contains("Перевод: продолжается")) {
|
||||
manga.status = SManga.ONGOING
|
||||
}
|
||||
|
||||
return manga
|
||||
}
|
||||
|
||||
override fun chapterListParse(response: Response): List<SChapter> {
|
||||
val html = response.body!!.string()
|
||||
|
||||
val jsonData = html.split("App.Collection.MangaChapter(").last().split("]);").first() + "]"
|
||||
val mangaName = html.split("mangaName: '").last().split("' });").first()
|
||||
val chapterList = mutableListOf<SChapter>()
|
||||
json.decodeFromString<JsonArray>(jsonData).forEach {
|
||||
chapterList.add(chapterFromElement(mangaName, it.jsonObject))
|
||||
}
|
||||
return chapterList
|
||||
}
|
||||
|
||||
override fun chapterListSelector(): String = throw Exception("Not Used")
|
||||
|
||||
private fun chapterFromElement(mangaName: String, element: JsonObject): SChapter {
|
||||
val chapter = SChapter.create()
|
||||
chapter.setUrlWithoutDomain("/$mangaName/${element["volume"]!!.jsonPrimitive.content}/${element["number"]!!.jsonPrimitive.content})/1")
|
||||
chapter.name = "Том ${element["volume"]!!.jsonPrimitive.content} - Глава ${element["number"]!!.jsonPrimitive.content} ${element["title"]!!.jsonPrimitive.content}"
|
||||
chapter.chapter_number = element["number"]!!.jsonPrimitive.float
|
||||
chapter.date_upload = SimpleDateFormat("yyyy-MM-dd", Locale.US).parse(element["date"]!!.jsonPrimitive.content)?.time ?: 0L
|
||||
return chapter
|
||||
}
|
||||
|
||||
override fun pageListParse(response: Response): List<Page> {
|
||||
val html = response.body!!.string()
|
||||
val rawPages = html.split("'pages': ").last().split(",\n").first()
|
||||
val jsonPages = json.decodeFromString<JsonObject>(rawPages)
|
||||
val pages = jsonPages.jsonObject
|
||||
|
||||
val rawCdnUrl = html.split("'srcBaseUrl': ").last().split(",\n").first()
|
||||
val cdnUrl = rawCdnUrl.replace("'", "")
|
||||
|
||||
val resPages = mutableListOf<Page>()
|
||||
pages.entries.forEach { (page, jsonElement) ->
|
||||
resPages.add(Page(page.toInt(), imageUrl = "$cdnUrl/${jsonElement.jsonObject["src"]!!.jsonPrimitive.content}"))
|
||||
}
|
||||
return resPages
|
||||
}
|
||||
|
||||
private class Genre(name: String, val id: String) : Filter.CheckBox(name) {
|
||||
override fun toString(): String {
|
||||
return name
|
||||
}
|
||||
}
|
||||
|
||||
private class GenreList(genres: Array<Genre>) : Filter.Select<Genre>("Genres", genres, 0)
|
||||
|
||||
override fun getFilterList() = FilterList(
|
||||
GenreList(getGenreList())
|
||||
)
|
||||
|
||||
/* [...document.querySelectorAll(".categories .item")]
|
||||
* .map(el => `Genre("${el.textContent.trim()}", "${el.getAttribute('href')}")`).join(',\n')
|
||||
* on https://manga-online.biz/genre/all/
|
||||
*/
|
||||
private fun getGenreList() = arrayOf(
|
||||
Genre("Все", "all"),
|
||||
Genre("Боевик", "boevik"),
|
||||
Genre("Боевые искусства", "boevye_iskusstva"),
|
||||
Genre("Вампиры", "vampiry"),
|
||||
Genre("Гарем", "garem"),
|
||||
Genre("Гендерная интрига", "gendernaya_intriga"),
|
||||
Genre("Героическое фэнтези", "geroicheskoe_fehntezi"),
|
||||
Genre("Детектив", "detektiv"),
|
||||
Genre("Дзёсэй", "dzyosehj"),
|
||||
Genre("Додзинси", "dodzinsi"),
|
||||
Genre("Драма", "drama"),
|
||||
Genre("Игра", "igra"),
|
||||
Genre("История", "istoriya"),
|
||||
Genre("Меха", "mekha"),
|
||||
Genre("Мистика", "mistika"),
|
||||
Genre("Научная фантастика", "nauchnaya_fantastika"),
|
||||
Genre("Повседневность", "povsednevnost"),
|
||||
Genre("Постапокалиптика", "postapokaliptika"),
|
||||
Genre("Приключения", "priklyucheniya"),
|
||||
Genre("Психология", "psihologiya"),
|
||||
Genre("Романтика", "romantika"),
|
||||
Genre("Самурайский боевик", "samurajskij_boevik"),
|
||||
Genre("Сверхъестественное", "sverhestestvennoe"),
|
||||
Genre("Сёдзё", "syodzyo"),
|
||||
Genre("Сёдзё-ай", "syodzyo-aj"),
|
||||
Genre("Сёнэн", "syonen"),
|
||||
Genre("Спорт", "sport"),
|
||||
Genre("Сэйнэн", "sejnen"),
|
||||
Genre("Трагедия", "tragediya"),
|
||||
Genre("Триллер", "triller"),
|
||||
Genre("Ужасы", "uzhasy"),
|
||||
Genre("Фантастика", "fantastika"),
|
||||
Genre("Фэнтези", "fentezi"),
|
||||
Genre("Школа", "shkola"),
|
||||
Genre("Этти", "etti"),
|
||||
Genre("Юри", "yuri"),
|
||||
Genre("Военный", "voennyj"),
|
||||
Genre("Жосей", "zhosej"),
|
||||
Genre("Магия", "magiya"),
|
||||
Genre("Полиция", "policiya"),
|
||||
Genre("Смена пола", "smena-pola"),
|
||||
Genre("Супер сила", "super-sila"),
|
||||
Genre("Эччи", "echchi"),
|
||||
Genre("Яой", "yaoj"),
|
||||
Genre("Сёнэн-ай", "syonen-aj")
|
||||
)
|
||||
|
||||
override fun imageUrlParse(document: Document) = throw Exception("Not Used")
|
||||
|
||||
override fun searchMangaSelector(): String = throw Exception("Not Used")
|
||||
|
||||
override fun chapterFromElement(element: Element): SChapter = throw Exception("Not Used")
|
||||
|
||||
override fun pageListParse(document: Document): List<Page> = throw Exception("Not Used")
|
||||
}
|
Loading…
Reference in New Issue