diff --git a/core/repair_jobs/dead_file_cleaner.py b/core/repair_jobs/dead_file_cleaner.py index 3da58fc9..de87758b 100644 --- a/core/repair_jobs/dead_file_cleaner.py +++ b/core/repair_jobs/dead_file_cleaner.py @@ -56,6 +56,19 @@ class DeadFileCleanerJob(RepairJob): def scan(self, context: JobContext) -> JobResult: result = JobResult() + # Safety: abort if transfer folder doesn't exist — prevents mass false positives + if not context.transfer_folder or not os.path.isdir(context.transfer_folder): + logger.error("Transfer folder not found: %s — aborting dead file scan to avoid false positives", + context.transfer_folder) + result.errors += 1 + if context.report_progress: + context.report_progress( + phase='Aborted — transfer folder not found', + log_line=f'Transfer folder does not exist: {context.transfer_folder}', + log_type='error' + ) + return result + # Fetch all tracks with file paths, joining to get artist/album names tracks = [] conn = None diff --git a/core/repair_worker.py b/core/repair_worker.py index 0fb4361f..1f20b867 100644 --- a/core/repair_worker.py +++ b/core/repair_worker.py @@ -500,8 +500,11 @@ class RepairWorker: self._current_job_name = job.display_name self._current_progress = {'scanned': 0, 'total': 0, 'percent': 0} - # Re-read transfer path - raw = self._get_transfer_path_from_db() + # Re-read transfer path — prefer config_manager (same source as web_server) + if self._config_manager: + raw = self._config_manager.get('soulseek.transfer_path', './Transfer') + else: + raw = self._get_transfer_path_from_db() self.transfer_folder = self._resolve_path(raw) # Notify rich progress system