Merge remote-tracking branch 'origin/master'

devi 3 years ago
commit 0b54029e26

@ -57,7 +57,7 @@
data-bs-toggle="modal" style="cursor: pointer;"> data-bs-toggle="modal" style="cursor: pointer;">
<i data-feather="power"></i> <i data-feather="power"></i>
</td> </td>
{% elseif case.failure.type == 'org.koitharu.kotatsu.parsers.exception.CloudFlareProtectedException' %} {% elseif case.failure.type == 'org.koitharu.kotatsu.parsers.CloudFlareProtectedException' %}
<td class="table-secondary text-center" data-bs-target="#failure_{{ case.hashCode }}" <td class="table-secondary text-center" data-bs-target="#failure_{{ case.hashCode }}"
data-bs-toggle="modal" style="cursor: pointer;"> data-bs-toggle="modal" style="cursor: pointer;">
<i data-feather="shield"></i> <i data-feather="shield"></i>
@ -101,29 +101,6 @@
feather.replace() feather.replace()
</script> </script>
</body> </body>
</html> </html>

@ -278,15 +278,7 @@ internal abstract class MadaraParser(
async { getChapters(manga, doc) } async { getChapters(manga, doc) }
} }
val desc = body.select(selectdesc).let { val desc = body.select(selectdesc).html()
if (it.select("p").text().isNotEmpty()) {
it.select("p").joinToString(separator = "\n\n") { p ->
p.text().replace("<br>", "\n")
}
} else {
it.text()
}
}
val stateDiv = (body.selectFirst("div.post-content_item:contains(Status)") val stateDiv = (body.selectFirst("div.post-content_item:contains(Status)")
?: body.selectFirst("div.post-content_item:contains(Statut)") ?: body.selectFirst("div.post-content_item:contains(Statut)")
@ -438,31 +430,31 @@ internal abstract class MadaraParser(
val d = date?.lowercase() ?: return 0 val d = date?.lowercase() ?: return 0
return when { return when {
d.endsWith(" ago") || d.endsWith(" atrás") || // Handle translated 'ago' in Portuguese. d.endsWith(" ago") || d.endsWith(" atrás") || // Handle translated 'ago' in Portuguese.
d.startsWith("") || // other translated 'ago' in Portuguese. d.startsWith("") || // other translated 'ago' in Portuguese.
d.endsWith(" hace") || // other translated 'ago' in Spanish d.endsWith(" hace") || // other translated 'ago' in Spanish
d.endsWith(" назад") || // other translated 'ago' in Russian d.endsWith(" назад") || // other translated 'ago' in Russian
d.endsWith(" önce") || // Handle translated 'ago' in Turkish. d.endsWith(" önce") || // Handle translated 'ago' in Turkish.
d.endsWith(" trước") || // Handle translated 'ago' in Viêt Nam. d.endsWith(" trước") || // Handle translated 'ago' in Viêt Nam.
d.startsWith("il y a") || // Handle translated 'ago' in French. d.startsWith("il y a") || // Handle translated 'ago' in French.
//If there is no ago but just a motion of time //If there is no ago but just a motion of time
// short Hours // short Hours
d.endsWith(" h") || d.endsWith(" h") ||
// short Day // short Day
d.endsWith(" d") || d.endsWith(" d") ||
// Day in Portuguese // Day in Portuguese
d.endsWith(" días") || d.endsWith(" día") || d.endsWith(" días") || d.endsWith(" día") ||
// Day in French // Day in French
d.endsWith(" jour") || d.endsWith(" jours") || d.endsWith(" jour") || d.endsWith(" jours") ||
// Hours in Portuguese // Hours in Portuguese
d.endsWith(" horas") || d.endsWith(" hora") || d.endsWith(" horas") || d.endsWith(" hora") ||
// Hours in french // Hours in french
d.endsWith(" heure") || d.endsWith(" heures") || d.endsWith(" heure") || d.endsWith(" heures") ||
// Minutes in English // Minutes in English
d.endsWith(" mins") || d.endsWith(" mins") ||
// Minutes in Portuguese // Minutes in Portuguese
d.endsWith(" minutos") || d.endsWith(" minuto") || d.endsWith(" minutos") || d.endsWith(" minuto") ||
//Minutes in French //Minutes in French
d.endsWith(" minute") || d.endsWith(" minutes") -> parseRelativeDate(date) d.endsWith(" minute") || d.endsWith(" minutes") -> parseRelativeDate(date)
// Handle 'yesterday' and 'today', using midnight // Handle 'yesterday' and 'today', using midnight
d.startsWith("year") -> Calendar.getInstance().apply { d.startsWith("year") -> Calendar.getInstance().apply {
@ -559,10 +551,10 @@ internal abstract class MadaraParser(
private fun createRequestTemplate() = private fun createRequestTemplate() =
("action=madara_load_more&page=1&template=madara-core%2Fcontent%2Fcontent-search&vars%5Bs%5D=&vars%5B" + ("action=madara_load_more&page=1&template=madara-core%2Fcontent%2Fcontent-search&vars%5Bs%5D=&vars%5B" +
"orderby%5D=meta_value_num&vars%5Bpaged%5D=1&vars%5Btemplate%5D=search&vars%5Bmeta_query" + "orderby%5D=meta_value_num&vars%5Bpaged%5D=1&vars%5Btemplate%5D=search&vars%5Bmeta_query" +
"%5D%5B0%5D%5Brelation%5D=AND&vars%5Bmeta_query%5D%5Brelation%5D=OR&vars%5Bpost_type" + "%5D%5B0%5D%5Brelation%5D=AND&vars%5Bmeta_query%5D%5Brelation%5D=OR&vars%5Bpost_type" +
"%5D=wp-manga&vars%5Bpost_status%5D=publish&vars%5Bmeta_key%5D=_latest_update&vars%5Border" + "%5D=wp-manga&vars%5Bpost_status%5D=publish&vars%5Bmeta_key%5D=_latest_update&vars%5Border" +
"%5D=desc&vars%5Bmanga_archives_item_layout%5D=default").split( "%5D=desc&vars%5Bmanga_archives_item_layout%5D=default").split(
'&', '&',
).map { ).map {
val pos = it.indexOf('=') val pos = it.indexOf('=')

@ -110,15 +110,7 @@ internal class MangaDass(context: MangaLoaderContext) :
val chaptersDeferred = async { getChapters(manga, doc) } val chaptersDeferred = async { getChapters(manga, doc) }
val desc = body.select(selectdesc).let { val desc = body.select(selectdesc).html()
if (it.select("p").text().isNotEmpty()) {
it.select("p").joinToString(separator = "\n\n") { p ->
p.text().replace("<br>", "\n")
}
} else {
it.text()
}
}
val stateDiv = (body.selectFirst("div.post-content_item:contains(Status)"))?.selectLast("div.summary-content") val stateDiv = (body.selectFirst("div.post-content_item:contains(Status)"))?.selectLast("div.summary-content")

@ -108,15 +108,7 @@ internal class MangaDna(context: MangaLoaderContext) :
val chaptersDeferred = async { getChapters(manga, doc) } val chaptersDeferred = async { getChapters(manga, doc) }
val desc = body.select(selectdesc).let { val desc = body.select(selectdesc).html()
if (it.select("p").text().isNotEmpty()) {
it.select("p").joinToString(separator = "\n\n") { p ->
p.text().replace("<br>", "\n")
}
} else {
it.text()
}
}
val stateDiv = (body.selectFirst("div.post-content_item:contains(Status)"))?.selectLast("div.summary-content") val stateDiv = (body.selectFirst("div.post-content_item:contains(Status)"))?.selectLast("div.summary-content")

@ -119,15 +119,7 @@ internal class HachiManga(context: MangaLoaderContext) : MadaraParser(context, M
val chaptersDeferred = async { getChapters(manga, doc) } val chaptersDeferred = async { getChapters(manga, doc) }
val desc = body.select(selectdesc).let { val desc = body.select(selectdesc).html()
if (it.select("p").text().isNotEmpty()) {
it.select("p").joinToString(separator = "\n\n") { p ->
p.text().replace("<br>", "\n")
}
} else {
it.text()
}
}
val stateDiv = (body.selectFirst("div.post-content_item:contains(状態)"))?.selectLast("div.summary-content") val stateDiv = (body.selectFirst("div.post-content_item:contains(状態)"))?.selectLast("div.summary-content")

@ -3,7 +3,6 @@ package org.koitharu.kotatsu.parsers
import okhttp3.Interceptor import okhttp3.Interceptor
import okhttp3.Response import okhttp3.Response
import okhttp3.internal.closeQuietly import okhttp3.internal.closeQuietly
import org.koitharu.kotatsu.parsers.exception.CloudFlareProtectedException
import java.net.HttpURLConnection import java.net.HttpURLConnection
private const val HEADER_SERVER = "Server" private const val HEADER_SERVER = "Server"
@ -11,18 +10,18 @@ private const val SERVER_CLOUDFLARE = "cloudflare"
internal class CloudFlareInterceptor : Interceptor { internal class CloudFlareInterceptor : Interceptor {
override fun intercept(chain: Interceptor.Chain): Response { override fun intercept(chain: Interceptor.Chain): Response {
val request = chain.request() val request = chain.request()
val response = chain.proceed(request) val response = chain.proceed(request)
if (response.code == HttpURLConnection.HTTP_FORBIDDEN || response.code == HttpURLConnection.HTTP_UNAVAILABLE) { if (response.code == HttpURLConnection.HTTP_FORBIDDEN || response.code == HttpURLConnection.HTTP_UNAVAILABLE) {
if (response.header(HEADER_SERVER)?.startsWith(SERVER_CLOUDFLARE) == true) { if (response.header(HEADER_SERVER)?.startsWith(SERVER_CLOUDFLARE) == true) {
response.closeQuietly() response.closeQuietly()
throw CloudFlareProtectedException( throw CloudFlareProtectedException(
url = response.request.url.toString(), url = response.request.url.toString(),
headers = request.headers, headers = request.headers,
) )
} }
} }
return response return response
} }
} }

@ -1,4 +1,4 @@
package org.koitharu.kotatsu.parsers.exception package org.koitharu.kotatsu.parsers
import okhttp3.Headers import okhttp3.Headers
import okio.IOException import okio.IOException
@ -6,4 +6,4 @@ import okio.IOException
class CloudFlareProtectedException( class CloudFlareProtectedException(
val url: String, val url: String,
val headers: Headers, val headers: Headers,
) : IOException("Protected by CloudFlare: $url") ) : IOException("Protected by CloudFlare: $url")
Loading…
Cancel
Save