|
|
|
@ -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 |
|
|
|
|