Upgrade the cleanup downloads to the new J2k version
This commit is contained in:
parent
604c7c703a
commit
b4e73cb1eb
@ -214,6 +214,13 @@ class DownloadManager(/* SY private */ val context: Context) {
|
||||
}
|
||||
|
||||
// SY -->
|
||||
/**
|
||||
* return the list of all manga folders
|
||||
*/
|
||||
fun getMangaFolders(source: Source): List<UniFile> {
|
||||
return provider.findSourceDir(source)?.listFiles()?.toList() ?: emptyList()
|
||||
}
|
||||
|
||||
/**
|
||||
* Deletes the directories of chapters that were read or have no match
|
||||
*
|
||||
@ -221,19 +228,39 @@ class DownloadManager(/* SY private */ val context: Context) {
|
||||
* @param manga the manga of the chapters.
|
||||
* @param source the source of the chapters.
|
||||
*/
|
||||
fun cleanupChapters(allChapters: List<Chapter>, manga: Manga, source: Source): Int {
|
||||
fun cleanupChapters(allChapters: List<Chapter>, manga: Manga, source: Source, removeRead: Boolean, removeNonFavorite: Boolean): Int {
|
||||
var cleaned = 0
|
||||
|
||||
if (removeNonFavorite && !manga.favorite) {
|
||||
val mangaFolder = provider.getMangaDir(manga, source)
|
||||
cleaned += 1 + (mangaFolder.listFiles()?.size ?: 0)
|
||||
mangaFolder.delete()
|
||||
cache.removeManga(manga)
|
||||
return cleaned
|
||||
}
|
||||
|
||||
val filesWithNoChapter = provider.findUnmatchedChapterDirs(allChapters, manga, source)
|
||||
cleaned += filesWithNoChapter.size
|
||||
cache.removeFolders(filesWithNoChapter.mapNotNull { it.name }, manga)
|
||||
filesWithNoChapter.forEach { it.delete() }
|
||||
val readChapters = allChapters.filter { it.read }
|
||||
val readChapterDirs = provider.findChapterDirs(readChapters, manga, source)
|
||||
readChapterDirs.forEach { it.delete() }
|
||||
cleaned += readChapterDirs.size
|
||||
cache.removeChapters(readChapters, manga)
|
||||
|
||||
if (removeRead) {
|
||||
val readChapters = allChapters.filter { it.read }
|
||||
val readChapterDirs = provider.findChapterDirs(readChapters, manga, source)
|
||||
readChapterDirs.forEach { it.delete() }
|
||||
cleaned += readChapterDirs.size
|
||||
cache.removeChapters(readChapters, manga)
|
||||
}
|
||||
|
||||
if (cache.getDownloadCount(manga) == 0) {
|
||||
provider.findChapterDirs(allChapters, manga, source).firstOrNull()?.parentFile?.delete() // Delete manga directory if empty
|
||||
val mangaFolder = provider.getMangaDir(manga, source)
|
||||
val size = mangaFolder.listFiles()?.size ?: 0
|
||||
if (size == 0) {
|
||||
mangaFolder.delete()
|
||||
cache.removeManga(manga)
|
||||
} else {
|
||||
Timber.e("Cache and download folder doesn't match for %s", manga.title)
|
||||
}
|
||||
}
|
||||
return cleaned
|
||||
}
|
||||
|
@ -130,7 +130,7 @@ class DownloadProvider(private val context: Context) {
|
||||
mangaDir.findFile(dir) ?: mangaDir.findFile("$dir.cbz") != null
|
||||
}
|
||||
} == null
|
||||
) || it.name?.endsWith("_tmp") == true
|
||||
) || it.name?.endsWith(Downloader.TMP_DIR_SUFFIX) == true
|
||||
}
|
||||
}
|
||||
// SY <--
|
||||
|
@ -12,6 +12,7 @@ import androidx.core.net.toUri
|
||||
import androidx.core.text.HtmlCompat
|
||||
import androidx.preference.PreferenceScreen
|
||||
import com.afollestad.materialdialogs.MaterialDialog
|
||||
import com.afollestad.materialdialogs.list.listItemsMultiChoice
|
||||
import eu.kanade.tachiyomi.R
|
||||
import eu.kanade.tachiyomi.data.cache.ChapterCache
|
||||
import eu.kanade.tachiyomi.data.database.DatabaseHelper
|
||||
@ -157,7 +158,11 @@ class SettingsAdvancedController : SettingsController() {
|
||||
titleRes = R.string.clean_up_downloaded_chapters
|
||||
summaryRes = R.string.delete_unused_chapters
|
||||
|
||||
onClick { cleanupDownloads() }
|
||||
onClick {
|
||||
val ctrl = CleanupDownloadsDialogController()
|
||||
ctrl.targetController = this@SettingsAdvancedController
|
||||
ctrl.showDialog(router)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -299,7 +304,22 @@ class SettingsAdvancedController : SettingsController() {
|
||||
}
|
||||
|
||||
// SY -->
|
||||
private fun cleanupDownloads() {
|
||||
class CleanupDownloadsDialogController : DialogController() {
|
||||
override fun onCreateDialog(savedViewState: Bundle?): Dialog {
|
||||
return MaterialDialog(activity!!).show {
|
||||
title(R.string.clean_up_downloaded_chapters)
|
||||
.listItemsMultiChoice(R.array.clean_up_downloads, disabledIndices = intArrayOf(0), initialSelection = intArrayOf(0, 1, 2)) { _, selections, _ ->
|
||||
val deleteRead = selections.contains(1)
|
||||
val deleteNonFavorite = selections.contains(2)
|
||||
(targetController as? SettingsAdvancedController)?.cleanupDownloads(deleteRead, deleteNonFavorite)
|
||||
}
|
||||
positiveButton(android.R.string.ok)
|
||||
negativeButton(android.R.string.cancel)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun cleanupDownloads(removeRead: Boolean, removeNonFavorite: Boolean) {
|
||||
if (job?.isActive == true) return
|
||||
activity?.toast(R.string.starting_cleanup)
|
||||
job = GlobalScope.launch(Dispatchers.IO, CoroutineStart.DEFAULT) {
|
||||
@ -307,10 +327,23 @@ class SettingsAdvancedController : SettingsController() {
|
||||
val sourceManager: SourceManager = Injekt.get()
|
||||
val downloadManager: DownloadManager = Injekt.get()
|
||||
var foldersCleared = 0
|
||||
mangaList.forEach { manga ->
|
||||
val chapterList = db.getChapters(manga).executeAsBlocking()
|
||||
val source = sourceManager.getOrStub(manga.source)
|
||||
foldersCleared += downloadManager.cleanupChapters(chapterList, manga, source)
|
||||
val sources = sourceManager.getOnlineSources()
|
||||
|
||||
for (source in sources) {
|
||||
val mangaFolders = downloadManager.getMangaFolders(source)
|
||||
val sourceManga = mangaList.filter { it.source == source.id }
|
||||
|
||||
for (mangaFolder in mangaFolders) {
|
||||
val manga = sourceManga.find { it.originalTitle == mangaFolder.name }
|
||||
if (manga == null) {
|
||||
// download is orphaned delete it
|
||||
foldersCleared += 1 + (mangaFolder.listFiles()?.size ?: 0)
|
||||
mangaFolder.delete()
|
||||
continue
|
||||
}
|
||||
val chapterList = db.getChapters(manga).executeAsBlocking()
|
||||
foldersCleared += downloadManager.cleanupChapters(chapterList, manga, source, removeRead, removeNonFavorite)
|
||||
}
|
||||
}
|
||||
launchUI {
|
||||
val activity = activity ?: return@launchUI
|
||||
|
8
app/src/main/res/values/arrays_sy.xml
Normal file
8
app/src/main/res/values/arrays_sy.xml
Normal file
@ -0,0 +1,8 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<resources>
|
||||
<string-array name="clean_up_downloads">
|
||||
<item>@string/clean_orphaned_downloads</item>
|
||||
<item>@string/clean_read_downloads</item>
|
||||
<item>@string/clean_read_manga_not_in_library</item>
|
||||
</string-array>
|
||||
</resources>
|
@ -130,6 +130,9 @@
|
||||
<string name="clean_up_downloaded_chapters">Clean up downloaded chapters</string>
|
||||
<string name="delete_unused_chapters">Delete non-existent, partially downloaded, and read chapter folders</string>
|
||||
<string name="no_folders_to_cleanup">No folders to cleanup</string>
|
||||
<string name="clean_orphaned_downloads">Clean orphaned</string>
|
||||
<string name="clean_read_downloads">Clean read</string>
|
||||
<string name="clean_read_manga_not_in_library">Clean manga not in library</string>
|
||||
<plurals name="cleanup_done">
|
||||
<item quantity="one">Cleanup done. Removed %d folder</item>
|
||||
<item quantity="other">Cleanup done. Removed %d folders</item>
|
||||
|
Loading…
x
Reference in New Issue
Block a user