feat: Auto-restore completed downloads on server restart
Scan the downloads folder on startup and recreate tasks for all video files. This prevents losing download history when the server restarts. - Only restores video files larger than 1MB (avoids partial files) - Preserves original file timestamps as created/completed dates - Generates new task IDs for restored downloads Generated with [Claude Code](https://claude.ai/code) via [Happy](https://happy.engineering) Co-Authored-By: Claude <noreply@anthropic.com> Co-Authored-By: Happy <yesreply@happy.engineering>
This commit is contained in:
@@ -32,6 +32,53 @@ app.add_middleware(
|
||||
# Initialize download manager
|
||||
download_manager = DownloadManager(download_dir="downloads", max_parallel=3)
|
||||
|
||||
|
||||
def restore_completed_downloads():
|
||||
"""Scan downloads directory and restore completed download tasks"""
|
||||
from datetime import datetime
|
||||
from pathlib import Path
|
||||
import uuid
|
||||
|
||||
download_dir = Path("downloads")
|
||||
if not download_dir.exists():
|
||||
return
|
||||
|
||||
# Get all video files (exclude partial files and logs)
|
||||
video_extensions = {'.mp4', '.mkv', '.avi', '.mov', '.wmv', '.flv', '.webm'}
|
||||
|
||||
for file_path in download_dir.iterdir():
|
||||
if file_path.is_file() and file_path.suffix.lower() in video_extensions:
|
||||
# Skip small files (likely partial or errors)
|
||||
if file_path.stat().st_size < 1024 * 1024: # Less than 1MB
|
||||
continue
|
||||
|
||||
filename = file_path.name
|
||||
file_size = file_path.stat().st_size
|
||||
|
||||
# Create a task for this file
|
||||
task_id = str(uuid.uuid4())
|
||||
task = DownloadTask(
|
||||
id=task_id,
|
||||
url="", # No original URL
|
||||
filename=filename,
|
||||
host="other",
|
||||
status=DownloadStatus.COMPLETED,
|
||||
progress=100.0,
|
||||
downloaded_bytes=file_size,
|
||||
total_bytes=file_size,
|
||||
speed=0.0,
|
||||
file_path=str(file_path),
|
||||
created_at=datetime.fromtimestamp(file_path.stat().st_ctime),
|
||||
completed_at=datetime.fromtimestamp(file_path.stat().st_mtime)
|
||||
)
|
||||
|
||||
download_manager.tasks[task_id] = task
|
||||
print(f"[RESTORE] Restored completed download: {filename}")
|
||||
|
||||
|
||||
# Restore completed downloads on startup
|
||||
restore_completed_downloads()
|
||||
|
||||
# Mount static files and templates
|
||||
app.mount("/static", StaticFiles(directory="static"), name="static")
|
||||
app.mount("/downloads", StaticFiles(directory="downloads"), name="downloads")
|
||||
|
||||
Reference in New Issue
Block a user