diff --git a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/grouple/GroupLe.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/grouple/GroupLe.kt
index 7ef28c343..372cbe6f6 100644
--- a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/grouple/GroupLe.kt
+++ b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/grouple/GroupLe.kt
@@ -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
").substringAfterLast(": ").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
")
+ .substringAfterLast(": ").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("Сингл") -> 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 {
- 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 {
+ override fun fetchSearchManga(
+ page: Int,
+ query: String,
+ filters: FilterList,
+ ): Observable {
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"
diff --git a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/grouple/GroupLeGenerator.kt b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/grouple/GroupLeGenerator.kt
index 151ba91d0..6a74b23f6 100644
--- a/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/grouple/GroupLeGenerator.kt
+++ b/multisrc/src/main/java/eu/kanade/tachiyomi/multisrc/grouple/GroupLeGenerator.kt
@@ -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),