Merge remote-tracking branch 'origin/master'

pull/328/head
gedoor 5 years ago
commit 468923d5dd
  1. 18
      .github/workflows/autoupdatefork.yml
  2. 3
      app/src/main/assets/updateLog.md
  3. 39
      app/src/main/java/io/legado/app/help/BookHelp.kt
  4. 15
      app/src/main/java/io/legado/app/ui/book/read/page/provider/ImageProvider.kt

@ -2,20 +2,13 @@
name: update fork name: update fork
on: on:
release:
types: [published]
push:
tags:
- 'v*'
schedule: schedule:
- cron: '50 3 * * *' #设置定时任务 - cron: '0 16 * * *' #设置定时任务
watch:
types: [started]
#1.设置secrets并命名为EMAIL,内容为邮箱地址,设置方法百度,不介意邮箱泄露,可以直接将${{ secrets.EMAIL }}替换为邮箱。2.设置用户名
jobs: jobs:
build: build:
runs-on: ubuntu-latest runs-on: ubuntu-latest
if: github.event.repository.owner.id == github.event.sender.id if: ${{ github.event.repository.owner.id == github.event.sender.id && github.actor != 'gedoor' }}
steps: steps:
- name: Checkout - name: Checkout
uses: actions/checkout@v2 uses: actions/checkout@v2
@ -27,11 +20,10 @@ jobs:
sudo apt-get -y install git sudo apt-get -y install git
- name: Set env - name: Set env
run: | run: |
git config --global user.email "${{ secrets.EMAIL }}" git config --global user.email "github-actions@github.com"
git config --global user.name "[用户名]" git config --global user.name "github-actions"
- name: Update fork - name: Update fork
run: | run: |
cd /home/runner/work/legado/legado
git remote add upstream https://github.com/gedoor/legado.git git remote add upstream https://github.com/gedoor/legado.git
git remote -v git remote -v
git fetch upstream git fetch upstream

@ -3,6 +3,9 @@
* 关注合作公众号 **[小说拾遗]()** 获取好看的小说。 * 关注合作公众号 **[小说拾遗]()** 获取好看的小说。
- 旧版数据导入教程:先在旧版阅读(2.x)中进行备份,然后在新版阅读(3.x)【我的】->【备份与恢复】,选择【导入旧版本数据】。 - 旧版数据导入教程:先在旧版阅读(2.x)中进行备份,然后在新版阅读(3.x)【我的】->【备份与恢复】,选择【导入旧版本数据】。
**2020/08/21**
* 图片(漫画源)支持离线下载了
**2020/08/20** **2020/08/20**
* 正文图片(漫画源)链接支持修改headers * 正文图片(漫画源)链接支持修改headers

@ -7,24 +7,30 @@ import io.legado.app.data.entities.Book
import io.legado.app.data.entities.BookChapter import io.legado.app.data.entities.BookChapter
import io.legado.app.data.entities.ReplaceRule import io.legado.app.data.entities.ReplaceRule
import io.legado.app.help.coroutine.Coroutine import io.legado.app.help.coroutine.Coroutine
import io.legado.app.model.analyzeRule.AnalyzeUrl
import io.legado.app.model.localBook.LocalBook import io.legado.app.model.localBook.LocalBook
import io.legado.app.utils.FileUtils import io.legado.app.utils.FileUtils
import io.legado.app.utils.MD5Utils import io.legado.app.utils.MD5Utils
import io.legado.app.utils.externalFilesDir import io.legado.app.utils.externalFilesDir
import io.legado.app.utils.postEvent import io.legado.app.utils.postEvent
import io.legado.app.utils.NetworkUtils
import kotlinx.coroutines.Dispatchers.IO import kotlinx.coroutines.Dispatchers.IO
import kotlinx.coroutines.Dispatchers.Main import kotlinx.coroutines.Dispatchers.Main
import kotlinx.coroutines.withContext import kotlinx.coroutines.withContext
import org.apache.commons.text.similarity.JaccardSimilarity import org.apache.commons.text.similarity.JaccardSimilarity
import org.jetbrains.anko.toast import org.jetbrains.anko.toast
import java.io.File import java.io.File
import java.util.regex.Pattern
import kotlin.math.min import kotlin.math.min
object BookHelp { object BookHelp {
private const val cacheFolderName = "book_cache" private const val cacheFolderName = "book_cache"
private const val cacheImageFolderName = "images"
private val downloadDir: File = App.INSTANCE.externalFilesDir private val downloadDir: File = App.INSTANCE.externalFilesDir
private val srcPattern =
Pattern.compile("<img .*?src.*?=.*?\"(.*?(?:,\\{.*\\})?)\".*?>", Pattern.CASE_INSENSITIVE)
private fun bookFolderName(book: Book): String { fun bookFolderName(book: Book): String {
return formatFolderName(book.name) + MD5Utils.md5Encode16(book.bookUrl) return formatFolderName(book.name) + MD5Utils.md5Encode16(book.bookUrl)
} }
@ -63,13 +69,44 @@ object BookHelp {
@Synchronized @Synchronized
fun saveContent(book: Book, bookChapter: BookChapter, content: String) { fun saveContent(book: Book, bookChapter: BookChapter, content: String) {
if (content.isEmpty()) return if (content.isEmpty()) return
//保存文本
FileUtils.createFileIfNotExist( FileUtils.createFileIfNotExist(
downloadDir, downloadDir,
formatChapterName(bookChapter), formatChapterName(bookChapter),
subDirs = *arrayOf(cacheFolderName, bookFolderName(book)) subDirs = *arrayOf(cacheFolderName, bookFolderName(book))
).writeText(content) ).writeText(content)
//保存图片
content.split("\n").forEach {
val matcher = srcPattern.matcher(it)
if (matcher.find()) {
var src = matcher.group(1)
src = NetworkUtils.getAbsoluteURL(bookChapter.url, src)
src?.let {
saveImage(book, src)
}
}
}
postEvent(EventBus.SAVE_CONTENT, bookChapter) postEvent(EventBus.SAVE_CONTENT, bookChapter)
} }
fun saveImage(book: Book, src:String) {
val analyzeUrl = AnalyzeUrl(src, null, null, null, null)
analyzeUrl.getImageBytes(book.origin)?.let {
FileUtils.createFileIfNotExist(
downloadDir,
"${MD5Utils.md5Encode16(src)}${src.substringAfterLast(".").substringBefore(",")}",
subDirs = *arrayOf(cacheFolderName, bookFolderName(book), cacheImageFolderName)
).writeBytes(it)
}
}
fun getImage(book:Book, src:String): File {
return FileUtils.getFile(
downloadDir,
"${MD5Utils.md5Encode16(src)}${src.substringAfterLast(".").substringBefore(",")}",
subDirs = *arrayOf(cacheFolderName, bookFolderName(book), cacheImageFolderName)
)
}
fun getChapterFiles(book: Book): List<String> { fun getChapterFiles(book: Book): List<String> {
val fileNameList = arrayListOf<String>() val fileNameList = arrayListOf<String>()

@ -3,15 +3,13 @@ package io.legado.app.ui.book.read.page.provider
import android.graphics.Bitmap import android.graphics.Bitmap
import io.legado.app.App import io.legado.app.App
import io.legado.app.data.entities.Book import io.legado.app.data.entities.Book
import io.legado.app.help.http.HttpHelper import io.legado.app.help.BookHelp
import io.legado.app.model.localBook.EPUBFile import io.legado.app.model.localBook.EPUBFile
import io.legado.app.utils.BitmapUtils import io.legado.app.utils.BitmapUtils
import io.legado.app.utils.FileUtils import io.legado.app.utils.FileUtils
import io.legado.app.utils.MD5Utils
import io.legado.app.utils.externalFilesDir import io.legado.app.utils.externalFilesDir
import java.io.FileOutputStream import java.io.FileOutputStream
import java.util.concurrent.ConcurrentHashMap import java.util.concurrent.ConcurrentHashMap
import io.legado.app.model.analyzeRule.AnalyzeUrl
object ImageProvider { object ImageProvider {
@ -36,11 +34,7 @@ object ImageProvider {
getCache(chapterIndex, src)?.let { getCache(chapterIndex, src)?.let {
return it return it
} }
val vFile = FileUtils.getFile( val vFile = BookHelp.getImage(book, src)
App.INSTANCE.externalFilesDir,
"${MD5Utils.md5Encode16(src)}${src.substringAfterLast(".").substringBefore(",")}",
"images", book.name
)
if (!vFile.exists()) { if (!vFile.exists()) {
if (book.isEpub()) { if (book.isEpub()) {
EPUBFile.getImage(book, src).use { EPUBFile.getImage(book, src).use {
@ -50,10 +44,7 @@ object ImageProvider {
out.close() out.close()
} }
} else if (!onUi) { } else if (!onUi) {
val analyzeUrl = AnalyzeUrl(src, null, null, null, null) BookHelp.saveImage(book, src)
analyzeUrl.getImageBytes(book.origin)?.let {
FileUtils.createFileIfNotExist(vFile.absolutePath).writeBytes(it)
}
} }
} }
return try { return try {

Loading…
Cancel
Save