feat: feedback verbetering - 06

This commit is contained in:
kodi
2026-03-15 15:51:13 +01:00
parent ae6a9d8c45
commit 9537a29de3
17 changed files with 368 additions and 37 deletions
+88
View File
@@ -89,6 +89,14 @@ class TaskRunner:
)
thread.start()
def enqueue_delete_batch(self, task_id: str, items: list[dict[str, object]]) -> None:
thread = threading.Thread(
target=self._run_delete_batch,
args=(task_id, items),
daemon=True,
)
thread.start()
def enqueue_archive_prepare(self, worker) -> None:
thread = threading.Thread(
target=worker,
@@ -490,6 +498,66 @@ class TaskRunner:
)
self._update_history_failed(task_id, str(exc))
def _run_delete_batch(self, task_id: str, items: list[dict[str, object]]) -> None:
total_items = self._total_delete_work_count(items)
current_item = self._first_delete_item_label(items)
if not self._repository.mark_running(
task_id=task_id,
done_items=0,
total_items=total_items,
current_item=current_item,
):
self._finalize_if_already_cancelled(task_id, done_items=0, total_items=total_items)
return
completed_items = 0
current_target = str(items[0]["target"]) if items else ""
try:
for item in items:
if self._is_cancel_requested(task_id):
self._finalize_cancelled(task_id, done_items=completed_items, total_items=total_items)
return
target = str(item["target"])
current_target = target
kind = str(item["kind"])
recursive = bool(item["recursive"])
files = list(item.get("files", [])) # type: ignore[arg-type]
directories = list(item.get("directories", [])) # type: ignore[arg-type]
if kind == "file":
completed_items = self._delete_planned_file(task_id, files[0], completed_items, total_items)
elif recursive:
for file_entry in files:
if self._is_cancel_requested(task_id):
self._finalize_cancelled(task_id, done_items=completed_items, total_items=total_items)
return
completed_items = self._delete_planned_file(task_id, file_entry, completed_items, total_items)
if self._is_cancel_requested(task_id):
self._finalize_cancelled(task_id, done_items=completed_items, total_items=total_items)
return
for directory in directories:
self._filesystem.delete_empty_directory(Path(directory))
else:
self._filesystem.delete_empty_directory(Path(target))
self._complete_or_cancel_item_task(
task_id=task_id,
done_items=completed_items,
total_items=total_items,
)
except OSError as exc:
task = self._repository.get_task(task_id)
failed_item = (task.get("current_item") if task else None) or current_target
self._repository.mark_failed(
task_id=task_id,
error_code="io_error",
error_message=str(exc),
failed_item=failed_item,
done_bytes=None,
total_bytes=None,
done_items=completed_items,
total_items=total_items,
)
self._update_history_failed(task_id, str(exc))
def _cleanup_partial_duplicate(self, path: Path) -> None:
if not path.exists():
return
@@ -556,6 +624,26 @@ class TaskRunner:
return files[0]["label"]
return None
def _total_delete_work_count(self, items: list[dict[str, object]]) -> int:
total = 0
for item in items:
progress_total_items = item.get("progress_total_items")
if progress_total_items is not None:
total += int(progress_total_items)
continue
total += len(self._file_entries(item))
return total
def _first_delete_item_label(self, items: list[dict[str, object]]) -> str | None:
for item in items:
progress_label = item.get("progress_label")
if isinstance(progress_label, str) and progress_label:
return progress_label
files = self._file_entries(item)
if files:
return files[0]["label"]
return None
def _copy_single_planned_file(
self,
task_id: str,