diff --git a/src/ru/remanga/build.gradle b/src/ru/remanga/build.gradle index 45cdb70cf..b87b78ac1 100644 --- a/src/ru/remanga/build.gradle +++ b/src/ru/remanga/build.gradle @@ -6,7 +6,7 @@ ext { extName = 'Remanga' pkgNameSuffix = 'ru.remanga' extClass = '.Remanga' - extVersionCode = 64 + extVersionCode = 65 } dependencies { diff --git a/src/ru/remanga/src/eu/kanade/tachiyomi/extension/ru/remanga/Remanga.kt b/src/ru/remanga/src/eu/kanade/tachiyomi/extension/ru/remanga/Remanga.kt index 559ab34d7..e2c56ec2c 100644 --- a/src/ru/remanga/src/eu/kanade/tachiyomi/extension/ru/remanga/Remanga.kt +++ b/src/ru/remanga/src/eu/kanade/tachiyomi/extension/ru/remanga/Remanga.kt @@ -37,12 +37,17 @@ import kotlinx.serialization.decodeFromString import kotlinx.serialization.json.Json import kotlinx.serialization.json.JsonObject import kotlinx.serialization.json.decodeFromJsonElement +import okhttp3.CacheControl +import okhttp3.FormBody import okhttp3.Headers import okhttp3.HttpUrl.Companion.toHttpUrl import okhttp3.Interceptor import okhttp3.MediaType.Companion.toMediaType +import okhttp3.MediaType.Companion.toMediaTypeOrNull import okhttp3.OkHttpClient import okhttp3.Request +import okhttp3.RequestBody +import okhttp3.RequestBody.Companion.toRequestBody import okhttp3.Response import okhttp3.ResponseBody.Companion.toResponseBody import org.jsoup.Jsoup @@ -55,6 +60,7 @@ import java.net.URLDecoder import java.text.SimpleDateFormat import java.util.Date import java.util.Locale +import java.util.concurrent.TimeUnit.MINUTES import kotlin.math.absoluteValue import kotlin.random.Random @@ -70,6 +76,20 @@ class Remanga : ConfigurableSource, HttpSource() { Injekt.get().getSharedPreferences("source_$id", 0x0000) } + private fun PUT( + url: String, + headers: Headers = Headers.Builder().build(), + body: RequestBody = FormBody.Builder().build(), + cache: CacheControl = CacheControl.Builder().maxAge(10, MINUTES).build(), + ): Request { + return Request.Builder() + .url(url) + .put(body) + .headers(headers) + .cacheControl(cache) + .build() + } + private val baseOrig: String = "https://api.remanga.org" private val baseMirr: String = "https://api.xn--80aaig9ahr.xn--c1avg" // https://реманга.орг private val domain: String? = preferences.getString(DOMAIN_PREF, baseOrig) @@ -447,6 +467,12 @@ class Remanga : ConfigurableSource, HttpSource() { scanlator = "exmanga" } } + + if (chapter.is_paid and (chapter.is_bought == true)) { + if (exChID == null) { + url = "$url#is_bought" + } + } } else { exChID = null } @@ -476,10 +502,35 @@ class Remanga : ConfigurableSource, HttpSource() { } @TargetApi(Build.VERSION_CODES.N) - private fun pageListParse(response: Response, urlRequest: String): List { + private fun pageListParse(response: Response, urlChapter: String): List { val body = response.body.string() val heightEmptyChunks = 10 - if (urlRequest.contains(baseUrl)) { + if (urlChapter.contains(exManga)) { + try { + val exPage = json.decodeFromString>>>(body) + val result = mutableListOf() + exPage.data.forEach { + it.filter { page -> page.height > heightEmptyChunks }.forEach { page -> + result.add(Page(result.size, "", page.link)) + } + } + return result + } catch (e: SerializationException) { + throw IOException("Главы больше нет на exmanga. Попробуйте обновить список глав (свайп сверху).") + } + } else { + if (urlChapter.contains("#is_bought") and (preferences.getBoolean(exPAID_PREF, true))) { + val newHeaders = exHeaders().newBuilder() + .add("Content-Type", "application/json") + .build() + client.newCall( + PUT( + "$exManga/chapter", + newHeaders, + body.toRequestBody("application/json; charset=utf-8".toMediaTypeOrNull()), + ), + ).execute() + } return try { val page = json.decodeFromString>(body) page.content.pages.filter { it.height > heightEmptyChunks }.map { @@ -495,19 +546,6 @@ class Remanga : ConfigurableSource, HttpSource() { } return result } - } else { - try { - val exPage = json.decodeFromString>>>(body) - val result = mutableListOf() - exPage.data.forEach { - it.filter { page -> page.height > heightEmptyChunks }.forEach { page -> - result.add(Page(result.size, "", page.link)) - } - } - return result - } catch (e: SerializationException) { - throw IOException("Главы больше нет на exmanga. Попробуйте обновить список глав (свайп сверху).") - } } } @@ -518,9 +556,12 @@ class Remanga : ConfigurableSource, HttpSource() { GET(chapter.url, exHeaders()) } else { if (chapter.name.contains("\uD83D\uDCB2")) { - throw IOException("Глава платная. Если вы покупаете главу, то, пожалуйста, поделитесь с другими через браузерное расширение exmanga.") + val noEX = if (preferences.getBoolean(exPAID_PREF, true)) { + "Если вы покупаете главу, то вы делитесь с другими пользователями exmanga." + } else { "Функции exmanga отключены." } + throw IOException("Глава платная. $noEX") } - GET(baseUrl + "/api/titles/chapters/" + chapter.url.substringAfterLast("/ch") + "/", headers) + GET(baseUrl + "/api/titles/chapters/" + chapter.url.substringAfterLast("/ch").substringBefore("#is_bought") + "/", headers) } } @@ -528,12 +569,12 @@ class Remanga : ConfigurableSource, HttpSource() { return client.newCall(pageListRequest(chapter)) .asObservableSuccess() .map { response -> - pageListParse(response, pageListRequest(chapter).url.toString()) + pageListParse(response, chapter.url) } } override fun getChapterUrl(chapter: SChapter): String { - return if (chapter.url.contains(exManga)) chapter.url else baseUrl.replace("api.", "") + chapter.url + return if (chapter.url.contains(exManga)) chapter.url else baseUrl.replace("api.", "") + chapter.url.substringBefore("#is_bought") } override fun fetchImageUrl(page: Page): Observable = Observable.just(page.imageUrl!!) @@ -840,7 +881,7 @@ class Remanga : ConfigurableSource, HttpSource() { val exChapterShow = androidx.preference.CheckBoxPreference(screen.context).apply { key = exPAID_PREF title = "Показывать главы из exmanga" - summary = "Показывает главы купленные другими людьми и поделившиеся ими через браузерное расширение exmanga" + summary = "Показывает главы купленные другими людьми и поделившиеся ими через браузерное расширение exmanga. Также отключает отправку ваших глав из Tachiyomi в exmanga." setDefaultValue(true) setOnPreferenceChangeListener { _, newValue ->