mirror of
https://github.com/gedoor/legado.git
synced 2024-07-04 23:36:56 +08:00
Compare commits
6 Commits
62f520079a
...
b6b6718177
Author | SHA1 | Date | |
---|---|---|---|
|
b6b6718177 | ||
|
2aed021e08 | ||
|
06d486c96c | ||
|
a35b7737aa | ||
|
9edc02f696 | ||
|
9d13b353b8 |
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -3,6 +3,7 @@
|
|||
local.properties
|
||||
.DS_Store
|
||||
/build
|
||||
build/
|
||||
/captures
|
||||
.externalNativeBuild
|
||||
/release
|
||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -1 +1 @@
|
|||
{"arm64-v8a":"bbf2c50d1ebf0763d451b08e290a3244","armeabi-v7a":"ecb872f7b1b5342f4d7c36262bec0600","x86":"4da4832b89e2412d808c5b1ecdc24e3d","x86_64":"62080f051db02ed0e939affb39ce67fb","version":"123.0.6312.80"}
|
||||
{"x86":"a9d092828a1a33ed43b3030e16353e9a","armeabi-v7a":"522f2f5304bf9250a43edc56bfff0fb4","x86_64":"bc89c549d18bcd26fef8e82fbad4a7cd","arm64-v8a":"ad9209119e3e74e532d07256b6e4e0ba","version":"124.0.6367.171"}
|
|
@ -13,6 +13,7 @@
|
|||
* 漫画源看书显示乱码,**阅读与其他软件的源并不通用**,请导入阅读的支持的漫画源!
|
||||
|
||||
**2024/02/27**
|
||||
* 更新cronet: 124.0.6367.171
|
||||
* 更新cronet: 123.0.6312.80
|
||||
* 更新cronet: 123.0.6312.40
|
||||
|
||||
|
|
|
@ -47,7 +47,7 @@ java.searchBook(bookName: string)
|
|||
* 添加书架
|
||||
|
||||
```js
|
||||
java.addBook(bookUrl)
|
||||
java.addBook(bookUrl: String)
|
||||
```
|
||||
|
||||
### [AnalyzeUrl](https://github.com/gedoor/legado/blob/master/app/src/main/java/io/legado/app/model/analyzeRule/AnalyzeUrl.kt) 部分函数
|
||||
|
@ -181,6 +181,11 @@ java.get*StringContent(url: String, path: String, charsetName: String): String
|
|||
|
||||
java.get*ByteArrayContent(url: String, path: String): ByteArray?
|
||||
|
||||
```
|
||||
* URI编码
|
||||
```js
|
||||
java.encodeURI(str: String) //默认enc="UTF-8"
|
||||
java.encodeURI(str: String, enc: String)
|
||||
```
|
||||
* base64
|
||||
> flags参数可省略,默认Base64.NO_WRAP,查看[flags参数说明](https://blog.csdn.net/zcmain/article/details/97051870)
|
||||
|
@ -384,16 +389,23 @@ source.getVariable()
|
|||
|
||||
* 登录头操作
|
||||
```js
|
||||
获取登录头
|
||||
source.getLoginHeader()
|
||||
获取登录头某一键值
|
||||
source.getLoginHeaderMap().get(key: String)
|
||||
保存登录头
|
||||
source.putLoginHeader(header: String)
|
||||
清除登录头
|
||||
source.removeLoginHeader()
|
||||
```
|
||||
* 用户登录信息操作
|
||||
> 使用`登录UI`规则,并成功登录,阅读自动加密保存登录UI规则中除type为button的信息
|
||||
```js
|
||||
login函数获取登录信息
|
||||
source.getLoginInfo()
|
||||
login函数获取登录信息键值
|
||||
source.getLoginInfoMap().get(key: String)
|
||||
清除登录信息
|
||||
source.removeLoginInfo()
|
||||
```
|
||||
## cookie对象的部分可用函数
|
||||
|
@ -402,6 +414,10 @@ source.removeLoginInfo()
|
|||
cookie.getCookie(url)
|
||||
获取cookie某一键值
|
||||
cookie.getKey(url,key)
|
||||
设置cookie
|
||||
cookie.setCookie(url,cookie)
|
||||
替换cookie
|
||||
cookie.replaceCookie(url,cookie)
|
||||
删除cookie
|
||||
cookie.removeCookie(url)
|
||||
```
|
||||
|
|
|
@ -284,14 +284,6 @@ data class Book(
|
|||
}
|
||||
}
|
||||
|
||||
fun getBookSource(): BookSource? {
|
||||
return appDb.bookSourceDao.getBookSource(origin)
|
||||
}
|
||||
|
||||
fun isLocalModified(): Boolean {
|
||||
return isLocal && LocalBook.getLastModified(this).getOrDefault(0L) > latestChapterTime
|
||||
}
|
||||
|
||||
fun toSearchBook() = SearchBook(
|
||||
name = name,
|
||||
author = author,
|
||||
|
|
|
@ -73,7 +73,7 @@ object AppWebDav {
|
|||
WebDav(bookProgressUrl, mAuthorization).makeAsDir()
|
||||
WebDav(exportsWebDavUrl, mAuthorization).makeAsDir()
|
||||
WebDav(bgWebDavUrl, mAuthorization).makeAsDir()
|
||||
val rootBooksUrl = "${rootWebDavUrl}books"
|
||||
val rootBooksUrl = "${rootWebDavUrl}books/"
|
||||
defaultBookWebDav = RemoteBookWebDav(rootBooksUrl, mAuthorization)
|
||||
authorization = mAuthorization
|
||||
}
|
||||
|
|
|
@ -5,17 +5,26 @@ package io.legado.app.help.book
|
|||
import android.net.Uri
|
||||
import com.script.SimpleBindings
|
||||
import com.script.rhino.RhinoScriptEngine
|
||||
import io.legado.app.constant.*
|
||||
import io.legado.app.constant.AppLog
|
||||
import io.legado.app.constant.BookSourceType
|
||||
import io.legado.app.constant.BookType
|
||||
import io.legado.app.data.appDb
|
||||
import io.legado.app.data.entities.BaseBook
|
||||
import io.legado.app.data.entities.Book
|
||||
import io.legado.app.data.entities.BookSource
|
||||
import io.legado.app.exception.NoStackTraceException
|
||||
import io.legado.app.help.config.AppConfig
|
||||
import io.legado.app.utils.*
|
||||
import io.legado.app.model.localBook.LocalBook
|
||||
import io.legado.app.utils.FileDoc
|
||||
import io.legado.app.utils.exists
|
||||
import io.legado.app.utils.find
|
||||
import io.legado.app.utils.inputStream
|
||||
import io.legado.app.utils.isUri
|
||||
import io.legado.app.utils.toastOnUi
|
||||
import splitties.init.appCtx
|
||||
import java.io.File
|
||||
import java.util.concurrent.ConcurrentHashMap
|
||||
import kotlin.collections.set
|
||||
|
||||
|
||||
val Book.isAudio: Boolean
|
||||
|
@ -223,6 +232,14 @@ fun Book.sync(oldBook: Book) {
|
|||
canUpdate = curBook.canUpdate
|
||||
}
|
||||
|
||||
fun Book.getBookSource(): BookSource? {
|
||||
return appDb.bookSourceDao.getBookSource(origin)
|
||||
}
|
||||
|
||||
fun Book.isLocalModified(): Boolean {
|
||||
return isLocal && LocalBook.getLastModified(this).getOrDefault(0L) > latestChapterTime
|
||||
}
|
||||
|
||||
fun Book.isSameNameAuthor(other: Any?): Boolean {
|
||||
if (other is BaseBook) {
|
||||
return name == other.name && author == other.author
|
||||
|
|
|
@ -178,13 +178,14 @@ open class WebDav(
|
|||
//依然是优化支持 caddy 自建的 WebDav ,其目录后缀都为“/”, 所以删除“/”的判定,不然无法获取该目录项
|
||||
val href = element.findNS("href", ns)[0].text().replace("+", "%2B")
|
||||
val hrefDecode = URLDecoder.decode(href, "UTF-8")
|
||||
.removeSuffix("/")
|
||||
val fileName = hrefDecode.substringAfterLast("/")
|
||||
val webDavFile: WebDav
|
||||
try {
|
||||
val urlName = hrefDecode.ifEmpty {
|
||||
url.file.replace("/", "")
|
||||
}
|
||||
val displayName = element
|
||||
.findNS("displayname", ns)
|
||||
.firstOrNull()?.text().orEmpty()
|
||||
val contentType = element
|
||||
.findNS("getcontenttype", ns)
|
||||
.firstOrNull()?.text().orEmpty()
|
||||
|
@ -206,7 +207,7 @@ open class WebDav(
|
|||
webDavFile = WebDavFile(
|
||||
fullURL,
|
||||
authorization,
|
||||
displayName = fileName,
|
||||
displayName = displayName,
|
||||
urlName = urlName,
|
||||
size = size,
|
||||
contentType = contentType,
|
||||
|
|
|
@ -11,6 +11,7 @@ import io.legado.app.data.entities.Book
|
|||
import io.legado.app.data.entities.BookChapter
|
||||
import io.legado.app.data.entities.BookSource
|
||||
import io.legado.app.help.book.ContentProcessor
|
||||
import io.legado.app.help.book.getBookSource
|
||||
import io.legado.app.help.coroutine.Coroutine
|
||||
import io.legado.app.service.AudioPlayService
|
||||
import io.legado.app.utils.postEvent
|
||||
|
|
|
@ -96,12 +96,11 @@ class WebService : BaseService() {
|
|||
if (addressList.any()) {
|
||||
notificationList.addAll(addressList.map { address -> getString(R.string.http_ip, address.hostAddress, getPort()) })
|
||||
hostAddress = notificationList.first()
|
||||
startForegroundNotification()
|
||||
} else {
|
||||
hostAddress = getString(R.string.network_connection_unavailable)
|
||||
notificationList.add(hostAddress)
|
||||
startForegroundNotification()
|
||||
}
|
||||
startForegroundNotification()
|
||||
postEvent(EventBus.WEB_SERVICE, hostAddress)
|
||||
}
|
||||
}
|
||||
|
@ -184,6 +183,7 @@ class WebService : BaseService() {
|
|||
*/
|
||||
override fun startForegroundNotification() {
|
||||
val builder = NotificationCompat.Builder(this, AppConst.channelIdWeb)
|
||||
.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
|
||||
.setSmallIcon(R.drawable.ic_web_service_noti)
|
||||
.setOngoing(true)
|
||||
.setContentTitle(getString(R.string.web_service))
|
||||
|
@ -196,7 +196,6 @@ class WebService : BaseService() {
|
|||
getString(R.string.cancel),
|
||||
servicePendingIntent<WebService>(IntentAction.stop)
|
||||
)
|
||||
builder.setVisibility(NotificationCompat.VISIBILITY_PUBLIC)
|
||||
val notification = builder.build()
|
||||
startForeground(NotificationId.WebService, notification)
|
||||
}
|
||||
|
|
|
@ -11,6 +11,7 @@ import io.legado.app.data.appDb
|
|||
import io.legado.app.data.entities.Book
|
||||
import io.legado.app.data.entities.BookChapter
|
||||
import io.legado.app.data.entities.BookSource
|
||||
import io.legado.app.help.book.getBookSource
|
||||
import io.legado.app.help.book.removeType
|
||||
import io.legado.app.model.AudioPlay
|
||||
import io.legado.app.model.AudioPlay.durChapter
|
||||
|
|
|
@ -1304,7 +1304,7 @@ class ReadBookActivity : BaseReadBookActivity(),
|
|||
when (dialogId) {
|
||||
TEXT_COLOR -> {
|
||||
setCurTextColor(color)
|
||||
postEvent(EventBus.UP_CONFIG, arrayListOf(2, 9, 11))
|
||||
postEvent(EventBus.UP_CONFIG, arrayListOf(2, 6, 9, 11))
|
||||
}
|
||||
|
||||
BG_COLOR -> {
|
||||
|
@ -1500,9 +1500,9 @@ class ReadBookActivity : BaseReadBookActivity(),
|
|||
5 -> if (isInitFinish) ReadBook.loadContent(resetPageOffset = false)
|
||||
6 -> readView.upContent(resetPageOffset = false)
|
||||
8 -> ChapterProvider.upStyle()
|
||||
9 -> binding.readView.invalidateTextPage()
|
||||
9 -> readView.invalidateTextPage()
|
||||
10 -> ChapterProvider.upLayout()
|
||||
11 -> binding.readView.submitRenderTask()
|
||||
11 -> readView.submitRenderTask()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -1543,10 +1543,10 @@ class ReadBookActivity : BaseReadBookActivity(),
|
|||
viewModel.searchResultList = it
|
||||
}
|
||||
observeEvent<Boolean>(EventBus.UPDATE_READ_ACTION_BAR) {
|
||||
binding.readMenu.reset()
|
||||
readMenu.reset()
|
||||
}
|
||||
observeEvent<Boolean>(EventBus.UP_SEEK_BAR) {
|
||||
binding.readMenu.upSeekBar()
|
||||
readMenu.upSeekBar()
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -20,6 +20,7 @@ import io.legado.app.help.AppWebDav
|
|||
import io.legado.app.help.book.BookHelp
|
||||
import io.legado.app.help.book.ContentProcessor
|
||||
import io.legado.app.help.book.isLocal
|
||||
import io.legado.app.help.book.isLocalModified
|
||||
import io.legado.app.help.book.removeType
|
||||
import io.legado.app.help.config.AppConfig
|
||||
import io.legado.app.help.coroutine.Coroutine
|
||||
|
|
|
@ -10,6 +10,7 @@ import io.legado.app.data.entities.Book
|
|||
import io.legado.app.data.entities.BookChapter
|
||||
import io.legado.app.help.book.BookContent
|
||||
import io.legado.app.help.book.BookHelp
|
||||
import io.legado.app.help.book.getBookSource
|
||||
import io.legado.app.help.config.AppConfig
|
||||
import io.legado.app.help.config.ReadBookConfig
|
||||
import io.legado.app.help.coroutine.Coroutine
|
||||
|
|
|
@ -194,10 +194,10 @@ object NetworkUtils {
|
|||
enumeration = NetworkInterface.getNetworkInterfaces()
|
||||
} catch (e: SocketException) {
|
||||
e.printOnDebug()
|
||||
return mutableListOf()
|
||||
return emptyList()
|
||||
}
|
||||
|
||||
var fallbackAddress: MutableList<InetAddress> = mutableListOf()
|
||||
val addressList = mutableListOf<InetAddress>()
|
||||
|
||||
while (enumeration.hasMoreElements()) {
|
||||
val nif = enumeration.nextElement()
|
||||
|
@ -205,13 +205,11 @@ object NetworkUtils {
|
|||
while (addresses.hasMoreElements()) {
|
||||
val address = addresses.nextElement()
|
||||
if (!address.isLoopbackAddress && isIPv4Address(address.hostAddress)) {
|
||||
if (nif.name?.startsWith("wlan") == true) {
|
||||
fallbackAddress.add(address)
|
||||
}
|
||||
addressList.add(address)
|
||||
}
|
||||
}
|
||||
}
|
||||
return fallbackAddress
|
||||
return addressList
|
||||
}
|
||||
|
||||
/**
|
||||
|
|
|
@ -42,7 +42,7 @@ android.defaults.buildfeatures.shaders=false
|
|||
# and none from the library's dependencies, thereby reducing the size of the R class for that library.
|
||||
android.nonTransitiveRClass=true
|
||||
# https://chromiumdash.appspot.com/releases?platform=Android
|
||||
CronetVersion=123.0.6312.80
|
||||
CronetMainVersion=123.0.0.0
|
||||
CronetVersion=124.0.6367.171
|
||||
CronetMainVersion=124.0.0.0
|
||||
android.injected.testOnly=false
|
||||
android.nonFinalResIds=true
|
Loading…
Reference in New Issue
Block a user