pull/32/head
parent
998ee9b92f
commit
ce4d2853f7
@ -0,0 +1,12 @@ |
||||
package io.legado.app.data.dao |
||||
|
||||
import androidx.room.Dao |
||||
import androidx.room.Query |
||||
|
||||
@Dao |
||||
interface SourceCookieDao { |
||||
|
||||
@Query("SELECT cookie FROM cookies Where url = :url") |
||||
fun getCookieByUrl(url: String): String? |
||||
|
||||
} |
@ -0,0 +1,12 @@ |
||||
package io.legado.app.data.entities |
||||
|
||||
import androidx.room.Entity |
||||
import androidx.room.Index |
||||
import androidx.room.PrimaryKey |
||||
|
||||
@Entity(tableName = "cookies", indices = [(Index(value = ["url"], unique = true))]) |
||||
data class SourceCookie( |
||||
@PrimaryKey |
||||
var url: String = "", |
||||
var cookie: String = "" |
||||
) |
@ -0,0 +1,215 @@ |
||||
package io.legado.app.model.analyzeRule |
||||
|
||||
import android.text.TextUtils |
||||
import com.jayway.jsonpath.JsonPath |
||||
import com.jayway.jsonpath.ReadContext |
||||
import java.util.* |
||||
import java.util.regex.Pattern |
||||
|
||||
class AnalyzeByJSonPath { |
||||
private var ctx: ReadContext? = null |
||||
|
||||
fun parse(json: Any): AnalyzeByJSonPath { |
||||
ctx = if (json is String) { |
||||
JsonPath.parse(json) |
||||
} else { |
||||
JsonPath.parse(json) |
||||
} |
||||
return this |
||||
} |
||||
|
||||
fun getString(rule: String): String? { |
||||
if (TextUtils.isEmpty(rule)) return null |
||||
var result = "" |
||||
val rules: Array<String> |
||||
val elementsType: String |
||||
if (rule.contains("&&")) { |
||||
rules = rule.split("&&".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray() |
||||
elementsType = "&" |
||||
} else { |
||||
rules = rule.split("\\|\\|".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray() |
||||
elementsType = "|" |
||||
} |
||||
if (rules.size == 1) { |
||||
if (!rule.contains("{$.")) { |
||||
ctx?.let { |
||||
try { |
||||
val ob = it.read<Any>(rule) |
||||
result = if (ob is List<*>) { |
||||
val builder = StringBuilder() |
||||
for (o in ob) { |
||||
builder.append(o).append("\n") |
||||
} |
||||
builder.toString().replace("\\n$".toRegex(), "") |
||||
} else { |
||||
ob.toString() |
||||
} |
||||
} catch (ignored: Exception) { |
||||
} |
||||
|
||||
} |
||||
return result |
||||
} else { |
||||
result = rule |
||||
val matcher = jsonRulePattern.matcher(rule) |
||||
while (matcher.find()) { |
||||
result = result.replace( |
||||
String.format("{%s}", matcher.group()), |
||||
getString(matcher.group())!! |
||||
) |
||||
} |
||||
return result |
||||
} |
||||
} else { |
||||
val sb = StringBuilder() |
||||
for (rl in rules) { |
||||
val temp = getString(rl) |
||||
if (!TextUtils.isEmpty(temp)) { |
||||
sb.append(temp) |
||||
if (elementsType == "|") { |
||||
break |
||||
} |
||||
} |
||||
} |
||||
return sb.toString() |
||||
} |
||||
} |
||||
|
||||
internal fun getStringList(rule: String): List<String> { |
||||
val result = ArrayList<String>() |
||||
if (TextUtils.isEmpty(rule)) return result |
||||
val rules: Array<String> |
||||
val elementsType: String |
||||
when { |
||||
rule.contains("&&") -> { |
||||
rules = rule.split("&&".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray() |
||||
elementsType = "&" |
||||
} |
||||
rule.contains("%%") -> { |
||||
rules = rule.split("%%".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray() |
||||
elementsType = "%" |
||||
} |
||||
else -> { |
||||
rules = rule.split("\\|\\|".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray() |
||||
elementsType = "|" |
||||
} |
||||
} |
||||
if (rules.size == 1) { |
||||
if (!rule.contains("{$.")) { |
||||
try { |
||||
val `object` = ctx!!.read<Any>(rule) ?: return result |
||||
if (`object` is List<*>) { |
||||
for (o in `object`) |
||||
result.add(o.toString()) |
||||
} else { |
||||
result.add(`object`.toString()) |
||||
} |
||||
} catch (ignored: Exception) { |
||||
} |
||||
|
||||
return result |
||||
} else { |
||||
val matcher = jsonRulePattern.matcher(rule) |
||||
while (matcher.find()) { |
||||
val stringList = getStringList(matcher.group()) |
||||
for (s in stringList) { |
||||
result.add(rule.replace(String.format("{%s}", matcher.group()), s)) |
||||
} |
||||
} |
||||
return result |
||||
} |
||||
} else { |
||||
val results = ArrayList<List<String>>() |
||||
for (rl in rules) { |
||||
val temp = getStringList(rl) |
||||
if (temp.isNotEmpty()) { |
||||
results.add(temp) |
||||
if (temp.isNotEmpty() && elementsType == "|") { |
||||
break |
||||
} |
||||
} |
||||
} |
||||
if (results.size > 0) { |
||||
if ("%" == elementsType) { |
||||
for (i in 0 until results[0].size) { |
||||
for (temp in results) { |
||||
if (i < temp.size) { |
||||
result.add(temp[i]) |
||||
} |
||||
} |
||||
} |
||||
} else { |
||||
for (temp in results) { |
||||
result.addAll(temp) |
||||
} |
||||
} |
||||
} |
||||
return result |
||||
} |
||||
} |
||||
|
||||
internal fun getObject(rule: String): Any { |
||||
return ctx!!.read(rule) |
||||
} |
||||
|
||||
internal fun getList(rule: String): ArrayList<Any>? { |
||||
val result = ArrayList<Any>() |
||||
if (TextUtils.isEmpty(rule)) return result |
||||
val elementsType: String |
||||
val rules: Array<String> |
||||
when { |
||||
rule.contains("&&") -> { |
||||
rules = rule.split("&&".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray() |
||||
elementsType = "&" |
||||
} |
||||
rule.contains("%%") -> { |
||||
rules = rule.split("%%".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray() |
||||
elementsType = "%" |
||||
} |
||||
else -> { |
||||
rules = rule.split("\\|\\|".toRegex()).dropLastWhile { it.isEmpty() }.toTypedArray() |
||||
elementsType = "|" |
||||
} |
||||
} |
||||
if (rules.size == 1) { |
||||
ctx?.let { |
||||
try { |
||||
return it.read<ArrayList<Any>>(rules[0]) |
||||
} catch (e: Exception) { |
||||
} |
||||
} |
||||
return null |
||||
} else { |
||||
val results = ArrayList<ArrayList<*>>() |
||||
for (rl in rules) { |
||||
val temp = getList(rl) |
||||
if (temp != null && temp.isNotEmpty()) { |
||||
results.add(temp) |
||||
if (temp.isNotEmpty() && elementsType == "|") { |
||||
break |
||||
} |
||||
} |
||||
} |
||||
if (results.size > 0) { |
||||
if ("%" == elementsType) { |
||||
for (i in 0 until results[0].size) { |
||||
for (temp in results) { |
||||
if (i < temp.size) { |
||||
temp[i]?.let { result.add(it) } |
||||
} |
||||
} |
||||
} |
||||
} else { |
||||
for (temp in results) { |
||||
result.addAll(temp) |
||||
} |
||||
} |
||||
} |
||||
} |
||||
return result |
||||
} |
||||
|
||||
companion object { |
||||
private val jsonRulePattern = Pattern.compile("(?<=\\{)\\$\\..+?(?=\\})") |
||||
} |
||||
} |
@ -0,0 +1,37 @@ |
||||
package io.legado.app.model.analyzeRule |
||||
|
||||
import android.text.TextUtils.isEmpty |
||||
import io.legado.app.App |
||||
import io.legado.app.R |
||||
import io.legado.app.data.entities.BookSource |
||||
import io.legado.app.utils.GSON |
||||
import io.legado.app.utils.fromJson |
||||
import io.legado.app.utils.getPrefString |
||||
import java.util.* |
||||
|
||||
/** |
||||
* Created by GKF on 2018/3/2. |
||||
* 解析Headers |
||||
*/ |
||||
|
||||
object AnalyzeHeaders { |
||||
|
||||
private val defaultUserAgent: String |
||||
get() = App.INSTANCE.getPrefString("user_agent") |
||||
?: App.INSTANCE.getString(R.string.pv_user_agent) |
||||
|
||||
fun getMap(bookSource: BookSource?): Map<String, String> { |
||||
val headerMap = HashMap<String, String>() |
||||
if (bookSource != null && !isEmpty(bookSource.header)) { |
||||
bookSource.header?.let { |
||||
val map: HashMap<String, String>? = GSON.fromJson<HashMap<String, String>>(it) |
||||
map?.let { headerMap.putAll(map) } |
||||
} |
||||
} |
||||
if (bookSource != null) { |
||||
val cookie = App.db.sourceCookieDao().getCookieByUrl(bookSource.origin) |
||||
cookie?.let { headerMap["Cookie"] = cookie } |
||||
} |
||||
return headerMap |
||||
} |
||||
} |
@ -0,0 +1,27 @@ |
||||
<?xml version="1.0" encoding="utf-8"?> |
||||
<resources> |
||||
<string name="pk_auto_refresh">auto_refresh</string> |
||||
<string name="pk_screen_direction">list_screen_direction</string> |
||||
<string name="pk_full_screen">full_screen</string> |
||||
<string name="pk_threads_num">threads_num</string> |
||||
<string name="pk_user_agent">user_agent</string> |
||||
<string name="pk_bookshelf_px">bookshelf_px</string> |
||||
<string name="pk_read_type">read_type</string> |
||||
<string name="pk_find_expand_group">expandGroupFind</string> |
||||
<string name="pk_default_read">defaultToRead</string> |
||||
<string name="pk_auto_download">autoDownload</string> |
||||
<string name="pk_download_path">downloadPath</string> |
||||
<string name="pk_check_update">checkUpdate</string> |
||||
|
||||
<string name="icon_main">ic_launcher_round</string> |
||||
<string name="icon_book">book_launcher_round</string> |
||||
|
||||
<string name="pv_user_agent">Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/62.0.2357.134 Safari/537.36</string> |
||||
|
||||
<string name="source_rule_url">https://gedoor.github.io/MyBookshelf/sourcerule.html</string> |
||||
<string name="this_github_url">https://github.com/gedoor/MyBookshelf</string> |
||||
<string name="disclaimer_url">https://gedoor.github.io/MyBookshelf/disclaimer.html</string> |
||||
<string name="home_page_url">https://gedoor.github.io/MyBookshelf/</string> |
||||
<string name="latest_release_url">https://github.com/gedoor/MyBookshelf/releases/latest</string> |
||||
<string name="latest_release_api">https://api.github.com/repos/gedoor/MyBookshelf/releases/latest</string> |
||||
</resources> |
Loading…
Reference in new issue