3.1 KiB
3.1 KiB
Feature Request: Real-time Logging & UI Refinement
1. Context & Objective
Users currently experience download failures without sufficient context or error details, making troubleshooting difficult.
The objective is to introduce a dedicated Logs System within the application to capture, display, and persist detailed execution logs from the yt-dlp process.
Additionally, the application's sidebar layout requires balancing for better UX.
2. Requirements
2.1. Backend (Rust) - Logging Infrastructure
- Stream Capture: The
downloadermodule must capture bothSTDOUT(progress) andSTDERR(errors/warnings) from theyt-dlpprocess. - Event Emission: Emit a new Tauri event
download-logto the frontend in real-time.- Payload:
{ id: String, message: String, level: 'info' | 'error' | 'debug' }
- Payload:
- Persistence (Optional but Recommended): Ideally, write logs to a local file (e.g.,
logs/{date}.logorlogs/{task_id}.log) for post-mortem analysis. For this iteration, real-time event emission is priority.
2.2. Frontend - Logs View
- New Route:
/logs - UI Layout:
- A dedicated Logs Tab in the main navigation.
- A console-like view displaying a stream of log messages.
- Filters: Filter by "Task ID" or "Level" (Error/Info).
- Real-time: The view must update automatically as new log events arrive.
- Detail: Failed downloads must show the specific error message returned by
yt-dlp(e.g., "Sign in required", "Video unavailable").
2.3. UI/UX - Sidebar Refactoring
- Reordering:
- Top Section: Home (Downloader), History.
- Bottom Section: Logs, Settings.
- Removal: Remove the "Version Number" text from the bottom of the sidebar (it can be moved to the Settings page if needed, or just removed as requested).
3. Implementation Steps
Step 1: Rust Backend Updates
- Modify
src-tauri/src/downloader.rs:- Update
download_videoto spawn the process withStdio::piped()for both stdout and stderr. - Use
tokio::select!or separate tasks to read both streams concurrently. - Emit
download-logevents for every line read. - Ensure the final error message (if exit code != 0) is explicitly captured and returned/logged.
- Update
Step 2: Frontend Store & Logic
- Create
src/stores/logs.ts:- State:
logs: LogEntry[]. - Action:
addLog(entry). - Listener: Listen for
download-logevents globally.
- State:
Step 3: Frontend UI
- Create
src/views/Logs.vue:- Display logs in a scrollable container.
- Style error logs in red, info in gray/white.
- Update
src/App.vue:- Add the
FileText(or similar) icon for Logs. - Refactor the sidebar Flexbox layout to push Logs and Settings to the bottom.
- Remove the version footer.
- Add the
- Update
src/router/index.tsto include the new route.
4. Success Criteria
- When a download fails, the user can go to the "Logs" tab and see the exact error output from
yt-dlp. - The sidebar looks balanced with navigation items split between top and bottom.