diff --git a/desktop/app/src/main/kotlin/com/abdownloadmanager/desktop/repository/AppRepository.kt b/desktop/app/src/main/kotlin/com/abdownloadmanager/desktop/repository/AppRepository.kt index 66cb661..75deaaa 100644 --- a/desktop/app/src/main/kotlin/com/abdownloadmanager/desktop/repository/AppRepository.kt +++ b/desktop/app/src/main/kotlin/com/abdownloadmanager/desktop/repository/AppRepository.kt @@ -7,9 +7,11 @@ import ir.amirab.downloader.DownloadSettings import com.abdownloadmanager.integration.Integration import com.abdownloadmanager.integration.IntegrationResult import com.abdownloadmanager.utils.autoremove.RemovedDownloadsFromDiskTracker +import com.abdownloadmanager.utils.category.CategoryManager import com.abdownloadmanager.utils.proxy.ProxyManager import ir.amirab.downloader.DownloadManager import ir.amirab.downloader.monitor.IDownloadMonitor +import ir.amirab.util.flow.withPrevious import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.flow.debounce import kotlinx.coroutines.flow.launchIn @@ -31,6 +33,7 @@ class AppRepository : KoinComponent { private val downloadMonitor: IDownloadMonitor = downloadSystem.downloadMonitor private val integration: Integration by inject() private val removedDownloadsFromDiskTracker: RemovedDownloadsFromDiskTracker by inject() + val categoryManager: CategoryManager by inject() val speedLimiter = appSettings.speedLimit val threadCount = appSettings.threadCount @@ -44,6 +47,18 @@ class AppRepository : KoinComponent { val trackDeletedFilesOnDisk = appSettings.trackDeletedFilesOnDisk init { + saveLocation + .debounce(500) + .withPrevious() + .onEach { (oldDownloadFolder, newDownloadFolder) -> + if (oldDownloadFolder == null) { + return@onEach + } + categoryManager.updateCategoryFoldersBasedOnDefaultDownloadFolder( + previousDownloadFolder = oldDownloadFolder, + currentDownloadFolder = newDownloadFolder, + ) + }.launchIn(scope) //maybe its better to move this to another place appSettings.autoStartOnBoot .debounce(500) diff --git a/shared/app-utils/src/main/kotlin/com/abdownloadmanager/utils/category/CategoryManager.kt b/shared/app-utils/src/main/kotlin/com/abdownloadmanager/utils/category/CategoryManager.kt index 4525519..a8dd82c 100644 --- a/shared/app-utils/src/main/kotlin/com/abdownloadmanager/utils/category/CategoryManager.kt +++ b/shared/app-utils/src/main/kotlin/com/abdownloadmanager/utils/category/CategoryManager.kt @@ -208,6 +208,26 @@ class CategoryManager( .mapNotNull { it.getDownloadPath() }.contains(folder) } + @Suppress("NAME_SHADOWING") + fun updateCategoryFoldersBasedOnDefaultDownloadFolder( + previousDownloadFolder: String, + currentDownloadFolder: String, + ) { + val previousDownloadFolder = File(previousDownloadFolder).absoluteFile + val currentDownloadFolder = File(currentDownloadFolder).absoluteFile + for (category in getCategories()) { + val categoryPath = File(category.path).absoluteFile + if (categoryPath.startsWith(previousDownloadFolder)) { + val relativePath = categoryPath.relativeTo(previousDownloadFolder) + updateCategory(category.id) { + it.copy( + path = currentDownloadFolder.resolve(relativePath).absolutePath + ) + } + } + } + } + companion object { /** * Reserved ids for default categories diff --git a/shared/utils/src/main/kotlin/ir/amirab/util/flow/FlowOperators.kt b/shared/utils/src/main/kotlin/ir/amirab/util/flow/FlowOperators.kt index c6c78cc..a81b204 100644 --- a/shared/utils/src/main/kotlin/ir/amirab/util/flow/FlowOperators.kt +++ b/shared/utils/src/main/kotlin/ir/amirab/util/flow/FlowOperators.kt @@ -54,7 +54,7 @@ fun Flow.rest(time: Long, emitLastEmissionWithoutRest: Boolean = false): fun Flow.concurrentMap( capacity: Int = Channel.BUFFERED, - transformBlock: suspend (T) -> R + transformBlock: suspend (T) -> R, ): Flow { return flow { coroutineScope { @@ -222,7 +222,7 @@ fun Flow.chunked(count: Int): Flow> = flow { } } -fun Flow.onEachLatest(block:suspend (T)->Unit) = transformLatest { +fun Flow.onEachLatest(block: suspend (T) -> Unit) = transformLatest { block(it) emit(it) } @@ -237,4 +237,6 @@ fun Flow.withPrevious( val current = it[1] as T transform(previous, current) } -} \ No newline at end of file +} + +fun Flow.withPrevious(): Flow> = withPrevious { previous, current -> previous to current } \ No newline at end of file