[RU]Remanga one scanlator per chapter (#11006)
* [RU]Remanga one scanlator per chapter * Real content type image * "/images/" url
This commit is contained in:
parent
94a23e3de2
commit
7bf89877ee
|
@ -6,7 +6,7 @@ ext {
|
||||||
extName = 'Remanga'
|
extName = 'Remanga'
|
||||||
pkgNameSuffix = 'ru.remanga'
|
pkgNameSuffix = 'ru.remanga'
|
||||||
extClass = '.Remanga'
|
extClass = '.Remanga'
|
||||||
extVersionCode = 46
|
extVersionCode = 47
|
||||||
}
|
}
|
||||||
|
|
||||||
dependencies {
|
dependencies {
|
||||||
|
|
|
@ -8,7 +8,6 @@ import MangaDetDto
|
||||||
import MyLibraryDto
|
import MyLibraryDto
|
||||||
import PageDto
|
import PageDto
|
||||||
import PageWrapperDto
|
import PageWrapperDto
|
||||||
import PublisherDto
|
|
||||||
import SeriesWrapperDto
|
import SeriesWrapperDto
|
||||||
import TagsDto
|
import TagsDto
|
||||||
import UserDto
|
import UserDto
|
||||||
|
@ -19,7 +18,6 @@ import android.content.SharedPreferences
|
||||||
import android.os.Build
|
import android.os.Build
|
||||||
import android.widget.Toast
|
import android.widget.Toast
|
||||||
import androidx.preference.ListPreference
|
import androidx.preference.ListPreference
|
||||||
import eu.kanade.tachiyomi.lib.dataimage.DataImageInterceptor
|
|
||||||
import eu.kanade.tachiyomi.network.GET
|
import eu.kanade.tachiyomi.network.GET
|
||||||
import eu.kanade.tachiyomi.network.asObservable
|
import eu.kanade.tachiyomi.network.asObservable
|
||||||
import eu.kanade.tachiyomi.network.asObservableSuccess
|
import eu.kanade.tachiyomi.network.asObservableSuccess
|
||||||
|
@ -37,12 +35,13 @@ import kotlinx.serialization.json.Json
|
||||||
import kotlinx.serialization.json.JsonObject
|
import kotlinx.serialization.json.JsonObject
|
||||||
import kotlinx.serialization.json.decodeFromJsonElement
|
import kotlinx.serialization.json.decodeFromJsonElement
|
||||||
import okhttp3.Headers
|
import okhttp3.Headers
|
||||||
import okhttp3.HttpUrl
|
|
||||||
import okhttp3.HttpUrl.Companion.toHttpUrl
|
import okhttp3.HttpUrl.Companion.toHttpUrl
|
||||||
import okhttp3.Interceptor
|
import okhttp3.Interceptor
|
||||||
|
import okhttp3.MediaType.Companion.toMediaType
|
||||||
import okhttp3.OkHttpClient
|
import okhttp3.OkHttpClient
|
||||||
import okhttp3.Request
|
import okhttp3.Request
|
||||||
import okhttp3.Response
|
import okhttp3.Response
|
||||||
|
import okhttp3.ResponseBody.Companion.toResponseBody
|
||||||
import org.jsoup.Jsoup
|
import org.jsoup.Jsoup
|
||||||
import rx.Observable
|
import rx.Observable
|
||||||
import uy.kohesive.injekt.Injekt
|
import uy.kohesive.injekt.Injekt
|
||||||
|
@ -67,7 +66,6 @@ class Remanga : ConfigurableSource, HttpSource() {
|
||||||
|
|
||||||
private val baseOrig: String = "https://api.remanga.org"
|
private val baseOrig: String = "https://api.remanga.org"
|
||||||
private val baseMirr: String = "https://api.xn--80aaig9ahr.xn--c1avg" // https://реманга.орг
|
private val baseMirr: String = "https://api.xn--80aaig9ahr.xn--c1avg" // https://реманга.орг
|
||||||
private val baseCookieUrl: HttpUrl = "https://remanga.org".toHttpUrl()
|
|
||||||
private val domain: String? = preferences.getString(DOMAIN_PREF, baseOrig)
|
private val domain: String? = preferences.getString(DOMAIN_PREF, baseOrig)
|
||||||
|
|
||||||
override val baseUrl = domain.toString()
|
override val baseUrl = domain.toString()
|
||||||
|
@ -84,7 +82,7 @@ class Remanga : ConfigurableSource, HttpSource() {
|
||||||
private fun authIntercept(chain: Interceptor.Chain): Response {
|
private fun authIntercept(chain: Interceptor.Chain): Response {
|
||||||
val request = chain.request()
|
val request = chain.request()
|
||||||
|
|
||||||
val cookies = client.cookieJar.loadForRequest(baseCookieUrl)
|
val cookies = client.cookieJar.loadForRequest(baseUrl.replace("api.", "").toHttpUrl())
|
||||||
val authCookie = cookies
|
val authCookie = cookies
|
||||||
.firstOrNull { cookie -> cookie.name == USER_COOKIE_NAME }
|
.firstOrNull { cookie -> cookie.name == USER_COOKIE_NAME }
|
||||||
?.let { cookie -> URLDecoder.decode(cookie.value, "UTF-8") }
|
?.let { cookie -> URLDecoder.decode(cookie.value, "UTF-8") }
|
||||||
|
@ -97,10 +95,21 @@ class Remanga : ConfigurableSource, HttpSource() {
|
||||||
.build()
|
.build()
|
||||||
return chain.proceed(authRequest)
|
return chain.proceed(authRequest)
|
||||||
}
|
}
|
||||||
|
private fun imageContentTypeIntercept(chain: Interceptor.Chain): Response {
|
||||||
|
val originalRequest = chain.request()
|
||||||
|
val response = chain.proceed(originalRequest)
|
||||||
|
val urlRequest = originalRequest.url.toString()
|
||||||
|
val possibleType = urlRequest.substringAfterLast("/").split(".")
|
||||||
|
return if (urlRequest.contains("/images/") and (possibleType.size == 2)) {
|
||||||
|
val realType = possibleType[1]
|
||||||
|
val image = response.body?.byteString()?.toResponseBody("image/$realType".toMediaType())
|
||||||
|
response.newBuilder().body(image).build()
|
||||||
|
} else
|
||||||
|
response
|
||||||
|
}
|
||||||
override val client: OkHttpClient =
|
override val client: OkHttpClient =
|
||||||
network.client.newBuilder()
|
network.client.newBuilder()
|
||||||
.addInterceptor(DataImageInterceptor())
|
.addInterceptor { imageContentTypeIntercept(it) }
|
||||||
.addInterceptor { authIntercept(it) }
|
.addInterceptor { authIntercept(it) }
|
||||||
.build()
|
.build()
|
||||||
|
|
||||||
|
@ -326,7 +335,7 @@ class Remanga : ConfigurableSource, HttpSource() {
|
||||||
val selectedBranch = branch.maxByOrNull { selector(it) }!!
|
val selectedBranch = branch.maxByOrNull { selector(it) }!!
|
||||||
return (1..(selectedBranch.count_chapters / 100 + 1)).map {
|
return (1..(selectedBranch.count_chapters / 100 + 1)).map {
|
||||||
val response = chapterListRequest(selectedBranch.id, it)
|
val response = chapterListRequest(selectedBranch.id, it)
|
||||||
chapterListParse(response, selectedBranch.publishers)
|
chapterListParse(response)
|
||||||
}.let { Observable.just(it.flatten()) }
|
}.let { Observable.just(it.flatten()) }
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -355,8 +364,7 @@ class Remanga : ConfigurableSource, HttpSource() {
|
||||||
return chapterName
|
return chapterName
|
||||||
}
|
}
|
||||||
|
|
||||||
override fun chapterListParse(response: Response): List<SChapter> = throw NotImplementedError("Unused")
|
override fun chapterListParse(response: Response): List<SChapter> {
|
||||||
private fun chapterListParse(response: Response, publishers: List<PublisherDto>): List<SChapter> {
|
|
||||||
var chapters = json.decodeFromString<SeriesWrapperDto<List<BookDto>>>(response.body!!.string()).content
|
var chapters = json.decodeFromString<SeriesWrapperDto<List<BookDto>>>(response.body!!.string()).content
|
||||||
if (!preferences.getBoolean(PAID_PREF, false)) {
|
if (!preferences.getBoolean(PAID_PREF, false)) {
|
||||||
chapters = chapters.filter { !it.is_paid or (it.is_bought == true) }
|
chapters = chapters.filter { !it.is_paid or (it.is_bought == true) }
|
||||||
|
@ -367,8 +375,8 @@ class Remanga : ConfigurableSource, HttpSource() {
|
||||||
name = chapterName(chapter)
|
name = chapterName(chapter)
|
||||||
url = "/api/titles/chapters/${chapter.id}"
|
url = "/api/titles/chapters/${chapter.id}"
|
||||||
date_upload = parseDate(chapter.upload_date)
|
date_upload = parseDate(chapter.upload_date)
|
||||||
scanlator = if (publishers.isNotEmpty()) {
|
scanlator = if (chapter.publishers.isNotEmpty()) {
|
||||||
publishers.joinToString { it.name }
|
chapter.publishers.joinToString { it.name }
|
||||||
} else null
|
} else null
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -9,8 +9,7 @@ data class TagsDto(
|
||||||
@Serializable
|
@Serializable
|
||||||
data class BranchesDto(
|
data class BranchesDto(
|
||||||
val id: Long,
|
val id: Long,
|
||||||
val count_chapters: Int,
|
val count_chapters: Int
|
||||||
val publishers: List<PublisherDto>
|
|
||||||
)
|
)
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
|
@ -91,7 +90,8 @@ data class BookDto(
|
||||||
val name: String,
|
val name: String,
|
||||||
val upload_date: String,
|
val upload_date: String,
|
||||||
val is_paid: Boolean,
|
val is_paid: Boolean,
|
||||||
val is_bought: Boolean?
|
val is_bought: Boolean?,
|
||||||
|
val publishers: List<PublisherDto>
|
||||||
)
|
)
|
||||||
|
|
||||||
@Serializable
|
@Serializable
|
||||||
|
|
Loading…
Reference in New Issue