|
|
@@ -25,14 +25,12 @@ import io.legado.app.help.book.ContentProcessor
|
|
|
import io.legado.app.help.config.AppConfig
|
|
|
import io.legado.app.help.coroutine.OrderCoroutine
|
|
|
import io.legado.app.utils.*
|
|
|
-import kotlinx.coroutines.Dispatchers
|
|
|
import kotlinx.coroutines.delay
|
|
|
import kotlinx.coroutines.ensureActive
|
|
|
-import kotlinx.coroutines.flow.flow
|
|
|
-import kotlinx.coroutines.flow.flowOn
|
|
|
import kotlinx.coroutines.sync.Mutex
|
|
|
import kotlinx.coroutines.sync.withLock
|
|
|
import me.ag2s.epublib.domain.*
|
|
|
+import me.ag2s.epublib.domain.Date
|
|
|
import me.ag2s.epublib.epub.EpubWriter
|
|
|
import me.ag2s.epublib.util.ResourceUtil
|
|
|
import splitties.init.appCtx
|
|
|
@@ -40,6 +38,8 @@ import java.io.ByteArrayOutputStream
|
|
|
import java.io.File
|
|
|
import java.io.FileOutputStream
|
|
|
import java.nio.charset.Charset
|
|
|
+import java.nio.file.*
|
|
|
+import java.util.*
|
|
|
import java.util.concurrent.ConcurrentHashMap
|
|
|
import kotlin.coroutines.coroutineContext
|
|
|
|
|
|
@@ -49,26 +49,67 @@ class CacheViewModel(application: Application) : BaseViewModel(application) {
|
|
|
val exportProgress = ConcurrentHashMap<String, Int>()
|
|
|
val exportMsg = ConcurrentHashMap<String, String>()
|
|
|
private val mutex = Mutex()
|
|
|
-
|
|
|
val cacheChapters = hashMapOf<String, HashSet<String>>()
|
|
|
|
|
|
- val bookCacheFlow = flow {
|
|
|
- //直接获取全部缓存信息,避免切换分组重新获取
|
|
|
- val books = appDb.bookDao.getByTypeOnLine(BookType.text or BookType.image)
|
|
|
- books.forEach { book ->
|
|
|
- val chapterCaches = hashSetOf<String>()
|
|
|
- val cacheNames = BookHelp.getChapterFiles(book)
|
|
|
- appDb.bookChapterDao.getChapterList(book.bookUrl).forEach { chapter ->
|
|
|
- if (cacheNames.contains(chapter.getFileName())) {
|
|
|
- chapterCaches.add(chapter.url)
|
|
|
+ @Volatile
|
|
|
+ private var exportNumber = 0
|
|
|
+
|
|
|
+ init {
|
|
|
+ loadCacheFiles()
|
|
|
+ }
|
|
|
+
|
|
|
+ private fun loadCacheFiles() {
|
|
|
+ execute {
|
|
|
+ //直接获取全部缓存信息,避免切换分组重新获取
|
|
|
+// if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
|
|
|
+// val visitor = object : SimpleFileVisitor<Path>() {
|
|
|
+//
|
|
|
+// var names: HashSet<String>? = null
|
|
|
+//
|
|
|
+// override fun preVisitDirectory(
|
|
|
+// dir: Path,
|
|
|
+// attrs: BasicFileAttributes?
|
|
|
+// ): FileVisitResult {
|
|
|
+// if (dir.name != "book_cache") {
|
|
|
+// names = hashSetOf()
|
|
|
+// }
|
|
|
+// return FileVisitResult.CONTINUE
|
|
|
+// }
|
|
|
+//
|
|
|
+// override fun visitFile(
|
|
|
+// file: Path,
|
|
|
+// attrs: BasicFileAttributes?
|
|
|
+// ): FileVisitResult {
|
|
|
+// names!!.add(file.name)
|
|
|
+// return FileVisitResult.CONTINUE
|
|
|
+// }
|
|
|
+//
|
|
|
+// override fun postVisitDirectory(dir: Path, exc: IOException?): FileVisitResult {
|
|
|
+// if (dir.name != "book_cache") {
|
|
|
+// cacheChapters[dir.name] = names!!
|
|
|
+// }
|
|
|
+// return FileVisitResult.CONTINUE
|
|
|
+// }
|
|
|
+// }
|
|
|
+// withContext(Dispatchers.IO) {
|
|
|
+// Files.walkFileTree(Paths.get(BookHelp.cachePath), emptySet(), 2, visitor)
|
|
|
+// }
|
|
|
+// return@execute
|
|
|
+// }
|
|
|
+ val books = appDb.bookDao.getByTypeOnLine(BookType.text or BookType.image)
|
|
|
+ books.forEach { book ->
|
|
|
+ val chapterCaches = hashSetOf<String>()
|
|
|
+ val cacheNames = BookHelp.getChapterFiles(book)
|
|
|
+ appDb.bookChapterDao.getChapterList(book.bookUrl).forEach { chapter ->
|
|
|
+ if (cacheNames.contains(chapter.getFileName())) {
|
|
|
+ chapterCaches.add(chapter.url)
|
|
|
+ }
|
|
|
}
|
|
|
+ cacheChapters[book.bookUrl] = chapterCaches
|
|
|
+ upAdapterLiveData.postValue(book.bookUrl)
|
|
|
}
|
|
|
- emit(Pair(book.bookUrl, chapterCaches))
|
|
|
}
|
|
|
- }.flowOn(Dispatchers.IO)
|
|
|
-
|
|
|
- @Volatile
|
|
|
- private var exportNumber = 0
|
|
|
+ }
|
|
|
|
|
|
private fun getExportFileName(book: Book): String {
|
|
|
val jsStr = AppConfig.bookExportFileName
|