fix: reset queue progress flag after queue completes

- Reset _queue_progress_initialized after each queue run so the next
  run re-creates the 'download_queue' progress entry
- Handle 'already exists' ProgressServiceError in _init_queue_progress
  as a no-op success to cover concurrent-start edge cases
- Guard stop_downloads() progress update to avoid crashing when the
  entry was never created
This commit is contained in:
2026-03-11 16:41:12 +01:00
parent db58ea9396
commit 0ec120e08f
2 changed files with 122 additions and 14 deletions

View File

@@ -395,7 +395,16 @@ class DownloadService:
)
self._queue_progress_initialized = True
except Exception as e:
logger.error("Failed to initialize queue progress: %s", e)
# If the entry already exists (e.g. from a concurrent task),
# treat that as success — the progress is usable.
from src.server.services.progress_service import ProgressServiceError
if isinstance(e, ProgressServiceError) and "already exists" in str(e):
logger.debug(
"Queue progress already initialized by concurrent task"
)
self._queue_progress_initialized = True
else:
logger.error("Failed to initialize queue progress: %s", e)
def _add_to_pending_queue(
self, item: DownloadItem, front: bool = False
@@ -759,8 +768,12 @@ class DownloadService:
"queue_status": queue_status.model_dump(mode="json")
},
)
# Reset flag so next queue run re-creates the progress entry
self._queue_progress_initialized = False
else:
logger.info("Queue processing stopped by user")
# Reset flag so next queue run re-creates the progress entry
self._queue_progress_initialized = False
async def start_next_download(self) -> Optional[str]:
"""Legacy method - redirects to start_queue_processing.
@@ -781,18 +794,21 @@ class DownloadService:
self._is_stopped = True
logger.info("Download processing stopped")
# Notify via progress service
queue_status = await self.get_queue_status()
await self._progress_service.update_progress(
progress_id="download_queue",
message="Queue processing stopped",
metadata={
"action": "queue_stopped",
"is_stopped": True,
"queue_status": queue_status.model_dump(mode="json"),
},
force_broadcast=True,
)
# Notify via progress service (guard against entry not existing)
try:
queue_status = await self.get_queue_status()
await self._progress_service.update_progress(
progress_id="download_queue",
message="Queue processing stopped",
metadata={
"action": "queue_stopped",
"is_stopped": True,
"queue_status": queue_status.model_dump(mode="json"),
},
force_broadcast=True,
)
except Exception as e:
logger.warning("Could not update queue progress on stop: %s", e)
async def get_queue_status(self) -> QueueStatus:
"""Get current status of all queues.