diff --git a/app/src/main/java/audio/funkwhale/ffa/activities/DownloadsActivity.kt b/app/src/main/java/audio/funkwhale/ffa/activities/DownloadsActivity.kt
index c5a34082bb5a712f3baf6f7d1a2d293341048cc7..5faa5ffa9306e67dbde1c5633a8c2ae76e27f9e0 100644
--- a/app/src/main/java/audio/funkwhale/ffa/activities/DownloadsActivity.kt
+++ b/app/src/main/java/audio/funkwhale/ffa/activities/DownloadsActivity.kt
@@ -14,7 +14,6 @@ import com.google.android.exoplayer2.offline.DownloadManager
 import kotlinx.coroutines.Dispatchers.Default
 import kotlinx.coroutines.Dispatchers.Main
 import kotlinx.coroutines.delay
-import kotlinx.coroutines.flow.collect
 import kotlinx.coroutines.launch
 import kotlinx.coroutines.withContext
 import org.koin.java.KoinJavaComponent.inject
@@ -65,20 +64,19 @@ class DownloadsActivity : AppCompatActivity() {
 
   private fun refresh() {
     lifecycleScope.launch(Main) {
-      val cursor = exoDownloadManager.downloadIndex.getDownloads()
-
       adapter.downloads.clear()
-
-      while (cursor.moveToNext()) {
-        val download = cursor.download
-
-        download.getMetadata()?.let { info ->
-          adapter.downloads.add(
-            info.apply { this.download = download }
-          )
+      exoDownloadManager.downloadIndex.getDownloads()
+        .use { cursor ->
+          while (cursor.moveToNext()) {
+            val download = cursor.download
+
+            download.getMetadata()?.let { info ->
+              adapter.downloads.add(
+                info.apply { this.download = download }
+              )
+            }
+          }
         }
-      }
-
       adapter.notifyDataSetChanged()
     }
   }
@@ -101,26 +99,29 @@ class DownloadsActivity : AppCompatActivity() {
   }
 
   private suspend fun refreshProgress() {
-    val cursor = exoDownloadManager.downloadIndex.getDownloads()
-
-    while (cursor.moveToNext()) {
-      val download = cursor.download
-
-      download.getMetadata()?.let { info ->
-        adapter.downloads.withIndex().associate { it.value to it.index }
-          .filter { it.key.id == info.id }.toList().getOrNull(0)?.let { match ->
-            if (download.state == Download.STATE_DOWNLOADING && download.percentDownloaded != info.download?.percentDownloaded ?: 0) {
-              withContext(Main) {
-                adapter.downloads[match.second] = info.apply {
-                  this.download = download
+    exoDownloadManager.downloadIndex.getDownloads()
+      .use { cursor ->
+        while (cursor.moveToNext()) {
+          val download = cursor.download
+
+          download.getMetadata()?.let { info ->
+            adapter.downloads.withIndex().associate { it.value to it.index }
+              .filter { it.key.id == info.id }.toList().getOrNull(0)?.let { match ->
+                if (download.state == Download.STATE_DOWNLOADING
+                  && download.percentDownloaded != (info.download?.percentDownloaded ?: 0)
+                ) {
+                  withContext(Main) {
+                    adapter.downloads[match.second] = info.apply {
+                      this.download = download
+                    }
+
+                    adapter.notifyItemChanged(match.second)
+                  }
                 }
-
-                adapter.notifyItemChanged(match.second)
               }
-            }
           }
+        }
       }
-    }
   }
 
   inner class DownloadChangedListener : DownloadsAdapter.OnDownloadChangedListener {
diff --git a/app/src/main/java/audio/funkwhale/ffa/repositories/TracksRepository.kt b/app/src/main/java/audio/funkwhale/ffa/repositories/TracksRepository.kt
index 6e14eef5aeea89e0b94b50a7415a9dcbf77ea364..4eb3dd41b1fc6f2a922fb5282bc19a4d1f0c6f97 100644
--- a/app/src/main/java/audio/funkwhale/ffa/repositories/TracksRepository.kt
+++ b/app/src/main/java/audio/funkwhale/ffa/repositories/TracksRepository.kt
@@ -42,19 +42,18 @@ class TracksRepository(override val context: Context?, albumId: Int) :
 
   companion object {
     fun getDownloadedIds(exoDownloadManager: DownloadManager): List<Int>? {
-      val cursor = exoDownloadManager.downloadIndex.getDownloads()
       val ids: MutableList<Int> = mutableListOf()
-
-      while (cursor.moveToNext()) {
-        val download = cursor.download
-
-        download.getMetadata()?.let {
-          if (download.state == Download.STATE_COMPLETED) {
-            ids.add(it.id)
+      exoDownloadManager.downloadIndex.getDownloads()
+        .use { cursor ->
+          while (cursor.moveToNext()) {
+            val download = cursor.download
+            download.getMetadata()?.let {
+              if (download.state == Download.STATE_COMPLETED) {
+                ids.add(it.id)
+              }
+            }
           }
         }
-      }
-
       return ids
     }
   }
diff --git a/changes/changelog.d/122.bugfix b/changes/changelog.d/122.bugfix
new file mode 100644
index 0000000000000000000000000000000000000000..eb3d6bc2392967e0aa2a74116105f5e57208dba6
--- /dev/null
+++ b/changes/changelog.d/122.bugfix
@@ -0,0 +1 @@
+Fix leaked database cursor resource
\ No newline at end of file