[RU] GroupLe - Use a more correct error message (#15491)

* [RU] GroupLe - Use a more correct error message

* Fix lint error
This commit is contained in:
Maxim Molochkov 2023-02-27 22:33:47 +04:00 committed by GitHub
parent 99106d21a9
commit 539530517e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 89 additions and 33 deletions

View File

@ -48,8 +48,12 @@ abstract class GroupLe(
.addNetworkInterceptor { chain ->
val originalRequest = chain.request()
val response = chain.proceed(originalRequest)
if (originalRequest.url.toString().contains(baseUrl) and (originalRequest.url.toString().contains("internal/redirect") or (response.code == 301))) {
throw IOException("Ссылка на мангу была изменена. Перемегрируйте мангу на тотже (или смежный с GroupLe) источник или передабавте из Поисковика/Каталога.")
if (originalRequest.url.toString().contains(baseUrl) and (
originalRequest.url.toString()
.contains("internal/redirect") or (response.code == 301)
)
) {
throw IOException("Ссылка на мангу была изменена. Перемигрируйте мангу на тот же (или смежный с GroupLe) источник или передобавьте из Поисковика/Каталога.")
}
response
}
@ -73,7 +77,8 @@ abstract class GroupLe(
override fun popularMangaFromElement(element: Element): SManga {
val manga = SManga.create()
manga.thumbnail_url = element.select("img.lazy").first()?.attr("data-original")?.replace("_p.", ".")
manga.thumbnail_url =
element.select("img.lazy").first()?.attr("data-original")?.replace("_p.", ".")
element.select("h3 > a").first()!!.let {
manga.setUrlWithoutDomain(it.attr("href"))
manga.title = it.attr("title")
@ -95,7 +100,9 @@ abstract class GroupLe(
override fun searchMangaNextPageSelector() = popularMangaNextPageSelector()
override fun searchMangaRequest(page: Int, query: String, filters: FilterList): Request {
val url = "$baseUrl/search/advancedResults?offset=${50 * (page - 1)}".toHttpUrlOrNull()!!.newBuilder()
val url =
"$baseUrl/search/advancedResults?offset=${50 * (page - 1)}".toHttpUrlOrNull()!!
.newBuilder()
if (query.isNotEmpty()) {
url.addQueryParameter("q", query)
}
@ -109,9 +116,14 @@ abstract class GroupLe(
"манга"
}
val ratingValue = infoElement.select(".col-sm-7 .rating-block").attr("data-score").toFloat() * 2
val ratingValueOver = infoElement.select(".info-icon").attr("data-content").substringBeforeLast("/5</b><br/>").substringAfterLast(": <b>").replace(",", ".").toFloat() * 2
val ratingVotes = infoElement.select(".col-sm-7 .user-rating meta[itemprop=\"ratingCount\"]").attr("content")
val ratingValue =
infoElement.select(".col-sm-7 .rating-block").attr("data-score").toFloat() * 2
val ratingValueOver =
infoElement.select(".info-icon").attr("data-content").substringBeforeLast("/5</b><br/>")
.substringAfterLast(": <b>").replace(",", ".").toFloat() * 2
val ratingVotes =
infoElement.select(".col-sm-7 .user-rating meta[itemprop=\"ratingCount\"]")
.attr("content")
val ratingStar = when {
ratingValue > 9.5 -> "★★★★★"
ratingValue > 8.5 -> "★★★★✬"
@ -125,8 +137,10 @@ abstract class GroupLe(
ratingValue > 0.5 -> "✬☆☆☆☆"
else -> "☆☆☆☆☆"
}
val rawAgeValue = infoElement.select(".elem_limitation .element-link").first()?.text() ?: ""
val rawAgeStop = when (rawAgeValue) {
val rawAgeStop = when (
val rawAgeValue =
infoElement.select(".elem_limitation .element-link").first()?.text() ?: ""
) {
"NC-17" -> "18+"
"R18+" -> "18+"
"R" -> "16+"
@ -136,21 +150,29 @@ abstract class GroupLe(
else -> rawAgeValue
}
val manga = SManga.create()
var authorElement = infoElement.select("span.elem_author").first()?.text()
if (authorElement == null) {
authorElement = infoElement.select("span.elem_screenwriter").first()?.text()
}
manga.title = document.select("h1.names .name").text()
manga.author = authorElement
manga.author = infoElement.select("span.elem_author").first()?.text() ?: infoElement.select(
"span.elem_screenwriter",
).first()?.text()
manga.artist = infoElement.select("span.elem_illustrator").first()?.text()
manga.genre = (category + ", " + rawAgeStop + ", " + infoElement.select("span.elem_genre").text() + ", " + infoElement.select("span.elem_tag").text()).split(", ").filter { it.isNotEmpty() }.joinToString { it.trim().lowercase() }
var altName = ""
if (infoElement.select(".another-names").isNotEmpty()) {
altName = "Альтернативные названия:\n" + infoElement.select(".another-names").text() + "\n\n"
manga.genre = (
"$category, $rawAgeStop, " + infoElement.select("span.elem_genre")
.text() + ", " + infoElement.select("span.elem_tag").text()
).split(", ")
.filter { it.isNotEmpty() }.joinToString { it.trim().lowercase() }
val altName = if (infoElement.select(".another-names").isNotEmpty()) {
"Альтернативные названия:\n" + infoElement.select(".another-names").text() + "\n\n"
} else {
""
}
manga.description = ratingStar + " " + ratingValue + "[ⓘ" + ratingValueOver + "]" + " (голосов: " + ratingVotes + ")\n" + altName + document.select("div#tab-description .manga-description").text()
manga.description =
"$ratingStar $ratingValue[ⓘ$ratingValueOver] (голосов: $ratingVotes)\n$altName" + document.select(
"div#tab-description .manga-description",
).text()
manga.status = when {
infoElement.html().contains("Запрещена публикация произведения по копирайту") || infoElement.html().contains("ЗАПРЕЩЕНА К ПУБЛИКАЦИИ НА ТЕРРИТОРИИ РФ!") -> SManga.LICENSED
infoElement.html()
.contains("Запрещена публикация произведения по копирайту") || infoElement.html()
.contains("ЗАПРЕЩЕНА К ПУБЛИКАЦИИ НА ТЕРРИТОРИИ РФ!") -> SManga.LICENSED
infoElement.html().contains("<b>Сингл</b>") -> SManga.COMPLETED
else ->
when (infoElement.select("p:contains(Перевод:) span").first()?.text()) {
@ -182,7 +204,8 @@ abstract class GroupLe(
return document.select(chapterListSelector()).map { chapterFromElement(it, manga) }
}
override fun chapterListSelector() = "div.chapters-link > table > tbody > tr:has(td > a):has(td.date:not(.text-info))"
override fun chapterListSelector() =
"div.chapters-link > table > tbody > tr:has(td > a):has(td.date:not(.text-info))"
private fun chapterFromElement(element: Element, manga: SManga): SChapter {
val urlElement = element.select("a.chapter-link").first()!!
@ -192,14 +215,15 @@ abstract class GroupLe(
val chapter = SChapter.create()
chapter.setUrlWithoutDomain(urlElement.attr("href") + "?mtr=true") // mtr is 18+ skip
var translators = ""
val translatorElement = urlElement.attr("title")
if (!translatorElement.isNullOrBlank()) {
translators = translatorElement
chapter.scanlator = if (!translatorElement.isNullOrBlank()) {
translatorElement
.replace("(Переводчик),", "&")
.removeSuffix(" (Переводчик)")
} else {
""
}
chapter.scanlator = translators
chapter.name = urlText.removeSuffix(" новое").trim()
if (manga.title.length > 25) {
@ -236,20 +260,27 @@ abstract class GroupLe(
when {
extra.containsMatchIn(chapter.name) -> {
if (chapter.name.substringAfter("Экстра").trim().isEmpty()) {
chapter.name = chapter.name.replaceFirst(" ", " - " + DecimalFormat("#,###.##").format(chapter.chapter_number).replace(",", ".") + " ")
chapter.name = chapter.name.replaceFirst(
" ",
" - " + DecimalFormat("#,###.##").format(chapter.chapter_number)
.replace(",", ".") + " ",
)
}
}
single.containsMatchIn(chapter.name) -> {
if (chapter.name.substringAfter("Сингл").trim().isEmpty()) {
chapter.name = DecimalFormat("#,###.##").format(chapter.chapter_number).replace(",", ".") + " " + chapter.name
chapter.name = DecimalFormat("#,###.##").format(chapter.chapter_number)
.replace(",", ".") + " " + chapter.name
}
}
}
}
override fun pageListParse(response: Response): List<Page> {
val html = response.body.string()
val document = response.asJsoup()
val html = document.html()
var readerMark = "rm_h.initReader( ["
@ -258,7 +289,19 @@ abstract class GroupLe(
}
if (!html.contains(readerMark)) {
throw Exception("Для просмотра 18+ контента необходима авторизация через WebView")
val isSourceSelector = ".account-menu"
val isAuthSelector = ".user-avatar"
val isAdultContent = document.select(isSourceSelector).let {
it.isNotEmpty() && it.select(isAuthSelector).isNullOrEmpty()
}
if (isAdultContent) {
throw Exception("Для просмотра 18+ контента необходима авторизация через WebView")
}
throw Exception("Не удалось загрузить главу. Url: ${response.request.url}")
}
val beginIndex = html.indexOf(readerMark)
@ -312,7 +355,11 @@ abstract class GroupLe(
return GET("$baseUrl/$id", headers)
}
override fun fetchSearchManga(page: Int, query: String, filters: FilterList): Observable<MangasPage> {
override fun fetchSearchManga(
page: Int,
query: String,
filters: FilterList,
): Observable<MangasPage> {
return if (query.startsWith(PREFIX_SLUG_SEARCH)) {
val realQuery = query.removePrefix(PREFIX_SLUG_SEARCH)
client.newCall(searchMangaByIdRequest(realQuery))
@ -335,7 +382,11 @@ abstract class GroupLe(
screen.addPreference(screen.editTextPreference(UAGENT_TITLE, UAGENT_DEFAULT, uagent))
}
private fun androidx.preference.PreferenceScreen.editTextPreference(title: String, default: String, value: String): androidx.preference.EditTextPreference {
private fun androidx.preference.PreferenceScreen.editTextPreference(
title: String,
default: String,
value: String,
): androidx.preference.EditTextPreference {
return androidx.preference.EditTextPreference(context).apply {
key = title
this.title = title
@ -345,7 +396,11 @@ abstract class GroupLe(
setOnPreferenceChangeListener { _, newValue ->
try {
val res = preferences.edit().putString(title, newValue as String).commit()
Toast.makeText(context, "Для смены User-Agent необходимо перезапустить приложение с полной остановкой.", Toast.LENGTH_LONG).show()
Toast.makeText(
context,
"Для смены User-Agent необходимо перезапустить приложение с полной остановкой.",
Toast.LENGTH_LONG,
).show()
res
} catch (e: Exception) {
e.printStackTrace()
@ -354,6 +409,7 @@ abstract class GroupLe(
}
}
}
companion object {
private const val UAGENT_TITLE = "User-Agent(для некоторых стран)"
private const val UAGENT_DEFAULT = "arora"

View File

@ -9,7 +9,7 @@ class GroupLeGenerator : ThemeSourceGenerator {
override val themeClass = "GroupLe"
override val baseVersionCode: Int = 11
override val baseVersionCode = 12
override val sources = listOf(
SingleLang("ReadManga", "https://readmanga.live", "ru", overrideVersionCode = 46),