Fix cleanup orphaned downloads removing valid downloads

This commit is contained in:
Jobobby04 2021-04-26 17:24:54 -04:00
parent be1e7f28ef
commit 4fa2c968a9
3 changed files with 22 additions and 23 deletions

View File

@ -263,7 +263,7 @@ class DownloadManager(private val context: Context) {
if (removeNonFavorite && !manga.favorite) { if (removeNonFavorite && !manga.favorite) {
val mangaFolder = provider.getMangaDir(manga, source) val mangaFolder = provider.getMangaDir(manga, source)
cleaned += 1 + (mangaFolder.listFiles()?.size ?: 0) cleaned += 1 + mangaFolder.listFiles().orEmpty().size
mangaFolder.delete() mangaFolder.delete()
cache.removeManga(manga) cache.removeManga(manga)
return cleaned return cleaned
@ -284,8 +284,7 @@ class DownloadManager(private val context: Context) {
if (cache.getDownloadCount(manga) == 0) { if (cache.getDownloadCount(manga) == 0) {
val mangaFolder = provider.getMangaDir(manga, source) val mangaFolder = provider.getMangaDir(manga, source)
val size = mangaFolder.listFiles()?.size ?: 0 if (!mangaFolder.listFiles().isNullOrEmpty()) {
if (size == 0) {
mangaFolder.delete() mangaFolder.delete()
cache.removeManga(manga) cache.removeManga(manga)
} else { } else {

View File

@ -123,14 +123,12 @@ class DownloadProvider(private val context: Context) {
source: Source source: Source
): List<UniFile> { ): List<UniFile> {
val mangaDir = findMangaDir(manga, source) ?: return emptyList() val mangaDir = findMangaDir(manga, source) ?: return emptyList()
return mangaDir.listFiles()!!.asList().filter { return mangaDir.listFiles().orEmpty().asList().filter {
(
chapters.find { chp -> chapters.find { chp ->
getValidChapterDirNames(chp).any { dir -> getValidChapterDirNames(chp).any { dir ->
mangaDir.findFile(dir) ?: mangaDir.findFile("$dir.cbz") != null mangaDir.findFile(dir) ?: mangaDir.findFile("$dir.cbz") != null
} }
} == null } == null || it.name?.endsWith(Downloader.TMP_DIR_SUFFIX) == true
) || it.name?.endsWith(Downloader.TMP_DIR_SUFFIX) == true
} }
} }
// SY <-- // SY <--

View File

@ -41,6 +41,7 @@ import eu.kanade.tachiyomi.util.preference.preferenceCategory
import eu.kanade.tachiyomi.util.preference.summaryRes import eu.kanade.tachiyomi.util.preference.summaryRes
import eu.kanade.tachiyomi.util.preference.switchPreference import eu.kanade.tachiyomi.util.preference.switchPreference
import eu.kanade.tachiyomi.util.preference.titleRes import eu.kanade.tachiyomi.util.preference.titleRes
import eu.kanade.tachiyomi.util.storage.DiskUtil
import eu.kanade.tachiyomi.util.system.powerManager import eu.kanade.tachiyomi.util.system.powerManager
import eu.kanade.tachiyomi.util.system.toast import eu.kanade.tachiyomi.util.system.toast
import exh.debug.SettingsDebugController import exh.debug.SettingsDebugController
@ -347,29 +348,30 @@ class SettingsAdvancedController : SettingsController() {
private fun cleanupDownloads(removeRead: Boolean, removeNonFavorite: Boolean) { private fun cleanupDownloads(removeRead: Boolean, removeNonFavorite: Boolean) {
if (job?.isActive == true) return if (job?.isActive == true) return
activity?.toast(R.string.starting_cleanup) activity?.toast(R.string.starting_cleanup)
job = GlobalScope.launch(Dispatchers.IO, CoroutineStart.DEFAULT) { job = launchIO {
val mangaList = db.getMangas().executeAsBlocking() val mangaList = db.getMangas().executeAsBlocking()
val sourceManager: SourceManager = Injekt.get()
val downloadManager: DownloadManager = Injekt.get() val downloadManager: DownloadManager = Injekt.get()
var foldersCleared = 0 var foldersCleared = 0
val sources = sourceManager.getOnlineSources() Injekt.get<SourceManager>().getOnlineSources().forEach { source ->
for (source in sources) {
val mangaFolders = downloadManager.getMangaFolders(source) val mangaFolders = downloadManager.getMangaFolders(source)
val sourceManga = mangaList.filter { it.source == source.id } val sourceManga = mangaList
.asSequence()
.filter { it.source == source.id }
.map { it to DiskUtil.buildValidFilename(it.originalTitle) }
.toList()
for (mangaFolder in mangaFolders) { mangaFolders.forEach mangaFolder@{ mangaFolder ->
val manga = sourceManga.find { it.originalTitle == mangaFolder.name } val manga = sourceManga.find { (_, folderName)-> folderName == mangaFolder.name }?.first
if (manga == null) { if (manga == null) {
// download is orphaned delete it // download is orphaned delete it
foldersCleared += 1 + (mangaFolder.listFiles()?.size ?: 0) foldersCleared += 1 + (mangaFolder.listFiles().orEmpty().size)
mangaFolder.delete() mangaFolder.delete()
continue } else {
}
val chapterList = db.getChapters(manga).executeAsBlocking() val chapterList = db.getChapters(manga).executeAsBlocking()
foldersCleared += downloadManager.cleanupChapters(chapterList, manga, source, removeRead, removeNonFavorite) foldersCleared += downloadManager.cleanupChapters(chapterList, manga, source, removeRead, removeNonFavorite)
} }
} }
}
withUIContext { withUIContext {
val activity = activity ?: return@withUIContext val activity = activity ?: return@withUIContext
val cleanupString = val cleanupString =