download_app/show_status.sh

107 lines
2.8 KiB
Bash
Executable File

#!/bin/bash
# 显示下载任务状态
SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )"
cd "$SCRIPT_DIR"
STATE_FILE="download_state.json"
# 检查状态文件是否存在
if [ ! -f "$STATE_FILE" ]; then
echo "⚠️ 状态文件不存在,服务可能尚未初始化"
exit 0
fi
# 使用 Python 解析 JSON 并显示状态
python3 << 'EOF'
import json
import os
STATE_FILE = "download_state.json"
try:
with open(STATE_FILE, 'r', encoding='utf-8') as f:
tasks = json.load(f)
if not tasks:
print("📋 暂无下载任务")
exit(0)
# 统计状态
status_count = {}
for task in tasks:
status = task.get('status', 'unknown')
status_count[status] = status_count.get(status, 0) + 1
# 显示统计
total = len(tasks)
print(f"📊 总计: {total} 个任务")
print()
status_map = {
'pending': ('⏳ 等待中', 'yellow'),
'downloading': ('⬇️ 下载中', 'blue'),
'retrying': ('🔄 重试中', 'orange'),
'completed': ('✅ 已完成', 'green'),
'failed': ('❌ 失败', 'red'),
}
for status, (label, _) in status_map.items():
count = status_count.get(status, 0)
if count > 0:
print(f" {label}: {count}")
print()
print("📋 任务详情:")
print("-" * 80)
# 显示每个任务
for i, task in enumerate(tasks, 1):
url = task.get('url', '')
status = task.get('status', 'unknown')
filename = task.get('filename', '')
size = task.get('size', 0)
error = task.get('error', '')
retry = task.get('retry', 0)
# 状态图标
status_icons = {
'pending': '⏳',
'downloading': '⬇️ ',
'retrying': '🔄',
'completed': '✅',
'failed': '❌',
}
icon = status_icons.get(status, '❓')
# 格式化大小
def format_size(bytes_size):
if bytes_size == 0:
return '-'
for unit in ['B', 'KB', 'MB', 'GB']:
if bytes_size < 1024:
return f"{bytes_size:.2f} {unit}"
bytes_size /= 1024
return f"{bytes_size:.2f} TB"
# URL 缩短显示
short_url = url if len(url) <= 60 else url[:57] + "..."
print(f"{i:2d}. {icon} {status}")
print(f" URL: {short_url}")
if filename:
print(f" 文件: {filename} ({format_size(size)})")
if retry > 0:
print(f" 重试: {retry} 次")
if error:
print(f" 错误: {error}")
print()
except FileNotFoundError:
print("⚠️ 状态文件不存在")
except json.JSONDecodeError:
print("⚠️ 状态文件格式错误")
except Exception as e:
print(f"⚠️ 读取状态失败: {e}")
EOF