From 4fa2c968a996700b4fef6e28f4fbd9b7fc43d723 Mon Sep 17 00:00:00 2001
From: Jobobby04 <jobobby04@users.noreply.github.com>
Date: Mon, 26 Apr 2021 17:24:54 -0400
Subject: [PATCH] Fix cleanup orphaned downloads removing valid downloads

---
 .../data/download/DownloadManager.kt          |  5 ++--
 .../data/download/DownloadProvider.kt         | 14 +++++-----
 .../ui/setting/SettingsAdvancedController.kt  | 26 ++++++++++---------
 3 files changed, 22 insertions(+), 23 deletions(-)

diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadManager.kt b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadManager.kt
index fd0b1e4b3..1b371adf7 100755
--- a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadManager.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadManager.kt
@@ -263,7 +263,7 @@ class DownloadManager(private val context: Context) {
 
         if (removeNonFavorite && !manga.favorite) {
             val mangaFolder = provider.getMangaDir(manga, source)
-            cleaned += 1 + (mangaFolder.listFiles()?.size ?: 0)
+            cleaned += 1 + mangaFolder.listFiles().orEmpty().size
             mangaFolder.delete()
             cache.removeManga(manga)
             return cleaned
@@ -284,8 +284,7 @@ class DownloadManager(private val context: Context) {
 
         if (cache.getDownloadCount(manga) == 0) {
             val mangaFolder = provider.getMangaDir(manga, source)
-            val size = mangaFolder.listFiles()?.size ?: 0
-            if (size == 0) {
+            if (!mangaFolder.listFiles().isNullOrEmpty()) {
                 mangaFolder.delete()
                 cache.removeManga(manga)
             } else {
diff --git a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadProvider.kt b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadProvider.kt
index 9b1f5e6e4..b99d84f1d 100755
--- a/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadProvider.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/data/download/DownloadProvider.kt
@@ -123,14 +123,12 @@ class DownloadProvider(private val context: Context) {
         source: Source
     ): List<UniFile> {
         val mangaDir = findMangaDir(manga, source) ?: return emptyList()
-        return mangaDir.listFiles()!!.asList().filter {
-            (
-                chapters.find { chp ->
-                    getValidChapterDirNames(chp).any { dir ->
-                        mangaDir.findFile(dir) ?: mangaDir.findFile("$dir.cbz") != null
-                    }
-                } == null
-                ) || it.name?.endsWith(Downloader.TMP_DIR_SUFFIX) == true
+        return mangaDir.listFiles().orEmpty().asList().filter {
+            chapters.find { chp ->
+                getValidChapterDirNames(chp).any { dir ->
+                    mangaDir.findFile(dir) ?: mangaDir.findFile("$dir.cbz") != null
+                }
+            } == null || it.name?.endsWith(Downloader.TMP_DIR_SUFFIX) == true
         }
     }
     // SY <--
diff --git a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsAdvancedController.kt b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsAdvancedController.kt
index 66489cb01..19e769b1b 100644
--- a/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsAdvancedController.kt
+++ b/app/src/main/java/eu/kanade/tachiyomi/ui/setting/SettingsAdvancedController.kt
@@ -41,6 +41,7 @@ import eu.kanade.tachiyomi.util.preference.preferenceCategory
 import eu.kanade.tachiyomi.util.preference.summaryRes
 import eu.kanade.tachiyomi.util.preference.switchPreference
 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.toast
 import exh.debug.SettingsDebugController
@@ -347,27 +348,28 @@ class SettingsAdvancedController : SettingsController() {
     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) {
+        job = launchIO {
             val mangaList = db.getMangas().executeAsBlocking()
-            val sourceManager: SourceManager = Injekt.get()
             val downloadManager: DownloadManager = Injekt.get()
             var foldersCleared = 0
-            val sources = sourceManager.getOnlineSources()
-
-            for (source in sources) {
+            Injekt.get<SourceManager>().getOnlineSources().forEach { 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) {
-                    val manga = sourceManga.find { it.originalTitle == mangaFolder.name }
+                mangaFolders.forEach mangaFolder@{ mangaFolder ->
+                    val manga = sourceManga.find { (_, folderName)-> folderName == mangaFolder.name }?.first
                     if (manga == null) {
                         // download is orphaned delete it
-                        foldersCleared += 1 + (mangaFolder.listFiles()?.size ?: 0)
+                        foldersCleared += 1 + (mangaFolder.listFiles().orEmpty().size)
                         mangaFolder.delete()
-                        continue
+                    } else {
+                        val chapterList = db.getChapters(manga).executeAsBlocking()
+                        foldersCleared += downloadManager.cleanupChapters(chapterList, manga, source, removeRead, removeNonFavorite)
                     }
-                    val chapterList = db.getChapters(manga).executeAsBlocking()
-                    foldersCleared += downloadManager.cleanupChapters(chapterList, manga, source, removeRead, removeNonFavorite)
                 }
             }
             withUIContext {