|
@@ -12,6 +12,7 @@ import eu.kanade.tachiyomi.data.database.models.Chapter
|
|
|
import eu.kanade.tachiyomi.data.database.models.Manga
|
|
|
import eu.kanade.tachiyomi.data.download.model.Download
|
|
|
import eu.kanade.tachiyomi.data.download.model.DownloadQueue
|
|
|
+import eu.kanade.tachiyomi.data.preference.PreferencesHelper
|
|
|
import eu.kanade.tachiyomi.source.SourceManager
|
|
|
import eu.kanade.tachiyomi.source.UnmeteredSource
|
|
|
import eu.kanade.tachiyomi.source.model.Page
|
|
@@ -35,7 +36,11 @@ import rx.android.schedulers.AndroidSchedulers
|
|
|
import rx.schedulers.Schedulers
|
|
|
import rx.subscriptions.CompositeSubscription
|
|
|
import uy.kohesive.injekt.injectLazy
|
|
|
+import java.io.BufferedOutputStream
|
|
|
import java.io.File
|
|
|
+import java.util.zip.CRC32
|
|
|
+import java.util.zip.ZipEntry
|
|
|
+import java.util.zip.ZipOutputStream
|
|
|
|
|
|
/**
|
|
|
* This class is the one in charge of downloading chapters.
|
|
@@ -60,6 +65,8 @@ class Downloader(
|
|
|
|
|
|
private val chapterCache: ChapterCache by injectLazy()
|
|
|
|
|
|
+ private val preferences: PreferencesHelper by injectLazy()
|
|
|
+
|
|
|
/**
|
|
|
* Store for persisting downloads across restarts.
|
|
|
*/
|
|
@@ -484,13 +491,51 @@ class Downloader(
|
|
|
|
|
|
// Only rename the directory if it's downloaded.
|
|
|
if (download.status == Download.State.DOWNLOADED) {
|
|
|
- tmpDir.renameTo(dirname)
|
|
|
+ if (preferences.saveChaptersAsCBZ().get()) {
|
|
|
+ archiveChapter(mangaDir, dirname, tmpDir)
|
|
|
+ } else {
|
|
|
+ tmpDir.renameTo(dirname)
|
|
|
+ }
|
|
|
cache.addChapter(dirname, mangaDir, download.manga)
|
|
|
|
|
|
DiskUtil.createNoMediaFile(tmpDir, context)
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ /**
|
|
|
+ * Archive the chapter pages as a CBZ.
|
|
|
+ */
|
|
|
+ private fun archiveChapter(
|
|
|
+ mangaDir: UniFile,
|
|
|
+ dirname: String,
|
|
|
+ tmpDir: UniFile,
|
|
|
+ ) {
|
|
|
+ val zip = mangaDir.createFile("$dirname.cbz.tmp")
|
|
|
+ ZipOutputStream(BufferedOutputStream(zip.openOutputStream())).use { zipOut ->
|
|
|
+ zipOut.setMethod(ZipEntry.STORED)
|
|
|
+
|
|
|
+ tmpDir.listFiles()?.forEach { img ->
|
|
|
+ img.openInputStream().use { input ->
|
|
|
+ val data = input.readBytes()
|
|
|
+ val size = img.length()
|
|
|
+ val entry = ZipEntry(img.name).apply {
|
|
|
+ val crc = CRC32().apply {
|
|
|
+ update(data)
|
|
|
+ }
|
|
|
+ setCrc(crc.value)
|
|
|
+
|
|
|
+ compressedSize = size
|
|
|
+ setSize(size)
|
|
|
+ }
|
|
|
+ zipOut.putNextEntry(entry)
|
|
|
+ zipOut.write(data)
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+ zip.renameTo("$dirname.cbz")
|
|
|
+ tmpDir.delete()
|
|
|
+ }
|
|
|
+
|
|
|
/**
|
|
|
* Completes a download. This method is called in the main thread.
|
|
|
*/
|