mirror of
https://github.com/TheSmallHanCat/sora2api.git
synced 2026-02-13 17:34:42 +08:00
feat: 新增每日用量统计 fix: 修复视频参数
This commit is contained in:
@@ -480,24 +480,33 @@ async def get_stats(token: str = Depends(verify_admin_token)):
|
||||
"""Get system statistics"""
|
||||
tokens = await token_manager.get_all_tokens()
|
||||
active_tokens = await token_manager.get_active_tokens()
|
||||
|
||||
|
||||
total_images = 0
|
||||
total_videos = 0
|
||||
total_errors = 0
|
||||
|
||||
today_images = 0
|
||||
today_videos = 0
|
||||
today_errors = 0
|
||||
|
||||
for token in tokens:
|
||||
stats = await db.get_token_stats(token.id)
|
||||
if stats:
|
||||
total_images += stats.image_count
|
||||
total_videos += stats.video_count
|
||||
total_errors += stats.error_count
|
||||
|
||||
today_images += stats.today_image_count
|
||||
today_videos += stats.today_video_count
|
||||
today_errors += stats.today_error_count
|
||||
|
||||
return {
|
||||
"total_tokens": len(tokens),
|
||||
"active_tokens": len(active_tokens),
|
||||
"total_images": total_images,
|
||||
"total_videos": total_videos,
|
||||
"total_errors": total_errors
|
||||
"today_images": today_images,
|
||||
"today_videos": today_videos,
|
||||
"total_errors": total_errors,
|
||||
"today_errors": today_errors
|
||||
}
|
||||
|
||||
# Sora2 endpoints
|
||||
|
||||
@@ -111,9 +111,9 @@ async def create_chat_completion(
|
||||
image_data = url.split("base64,", 1)[1]
|
||||
else:
|
||||
image_data = url
|
||||
elif item.get("type") == "input_video":
|
||||
# Extract video from input_video
|
||||
video_url = item.get("videoUrl", {})
|
||||
elif item.get("type") == "video_url":
|
||||
# Extract video from video_url
|
||||
video_url = item.get("video_url", {})
|
||||
url = video_url.get("url", "")
|
||||
if url.startswith("data:video") or url.startswith("data:application"):
|
||||
# Extract base64 data from data URI
|
||||
|
||||
@@ -283,6 +283,10 @@ class Database:
|
||||
video_count INTEGER DEFAULT 0,
|
||||
error_count INTEGER DEFAULT 0,
|
||||
last_error_at TIMESTAMP,
|
||||
today_image_count INTEGER DEFAULT 0,
|
||||
today_video_count INTEGER DEFAULT 0,
|
||||
today_error_count INTEGER DEFAULT 0,
|
||||
today_date DATE,
|
||||
FOREIGN KEY (token_id) REFERENCES tokens(id)
|
||||
)
|
||||
""")
|
||||
@@ -393,6 +397,16 @@ class Database:
|
||||
await db.execute("CREATE INDEX IF NOT EXISTS idx_task_status ON tasks(status)")
|
||||
await db.execute("CREATE INDEX IF NOT EXISTS idx_token_active ON tokens(is_active)")
|
||||
|
||||
# Migration: Add daily statistics columns if they don't exist
|
||||
if not await self._column_exists(db, "token_stats", "today_image_count"):
|
||||
await db.execute("ALTER TABLE token_stats ADD COLUMN today_image_count INTEGER DEFAULT 0")
|
||||
if not await self._column_exists(db, "token_stats", "today_video_count"):
|
||||
await db.execute("ALTER TABLE token_stats ADD COLUMN today_video_count INTEGER DEFAULT 0")
|
||||
if not await self._column_exists(db, "token_stats", "today_error_count"):
|
||||
await db.execute("ALTER TABLE token_stats ADD COLUMN today_error_count INTEGER DEFAULT 0")
|
||||
if not await self._column_exists(db, "token_stats", "today_date"):
|
||||
await db.execute("ALTER TABLE token_stats ADD COLUMN today_date DATE")
|
||||
|
||||
await db.commit()
|
||||
|
||||
async def init_config_from_toml(self, config_dict: dict, is_first_startup: bool = True):
|
||||
@@ -729,28 +743,91 @@ class Database:
|
||||
|
||||
async def increment_image_count(self, token_id: int):
|
||||
"""Increment image generation count"""
|
||||
from datetime import date
|
||||
async with aiosqlite.connect(self.db_path) as db:
|
||||
await db.execute("""
|
||||
UPDATE token_stats SET image_count = image_count + 1 WHERE token_id = ?
|
||||
""", (token_id,))
|
||||
today = str(date.today())
|
||||
# Get current stats
|
||||
cursor = await db.execute("SELECT today_date FROM token_stats WHERE token_id = ?", (token_id,))
|
||||
row = await cursor.fetchone()
|
||||
|
||||
# If date changed, reset today's count
|
||||
if row and row[0] != today:
|
||||
await db.execute("""
|
||||
UPDATE token_stats
|
||||
SET image_count = image_count + 1,
|
||||
today_image_count = 1,
|
||||
today_date = ?
|
||||
WHERE token_id = ?
|
||||
""", (today, token_id))
|
||||
else:
|
||||
# Same day, just increment both
|
||||
await db.execute("""
|
||||
UPDATE token_stats
|
||||
SET image_count = image_count + 1,
|
||||
today_image_count = today_image_count + 1,
|
||||
today_date = ?
|
||||
WHERE token_id = ?
|
||||
""", (today, token_id))
|
||||
await db.commit()
|
||||
|
||||
|
||||
async def increment_video_count(self, token_id: int):
|
||||
"""Increment video generation count"""
|
||||
from datetime import date
|
||||
async with aiosqlite.connect(self.db_path) as db:
|
||||
await db.execute("""
|
||||
UPDATE token_stats SET video_count = video_count + 1 WHERE token_id = ?
|
||||
""", (token_id,))
|
||||
today = str(date.today())
|
||||
# Get current stats
|
||||
cursor = await db.execute("SELECT today_date FROM token_stats WHERE token_id = ?", (token_id,))
|
||||
row = await cursor.fetchone()
|
||||
|
||||
# If date changed, reset today's count
|
||||
if row and row[0] != today:
|
||||
await db.execute("""
|
||||
UPDATE token_stats
|
||||
SET video_count = video_count + 1,
|
||||
today_video_count = 1,
|
||||
today_date = ?
|
||||
WHERE token_id = ?
|
||||
""", (today, token_id))
|
||||
else:
|
||||
# Same day, just increment both
|
||||
await db.execute("""
|
||||
UPDATE token_stats
|
||||
SET video_count = video_count + 1,
|
||||
today_video_count = today_video_count + 1,
|
||||
today_date = ?
|
||||
WHERE token_id = ?
|
||||
""", (today, token_id))
|
||||
await db.commit()
|
||||
|
||||
async def increment_error_count(self, token_id: int):
|
||||
"""Increment error count"""
|
||||
from datetime import date
|
||||
async with aiosqlite.connect(self.db_path) as db:
|
||||
await db.execute("""
|
||||
UPDATE token_stats
|
||||
SET error_count = error_count + 1, last_error_at = CURRENT_TIMESTAMP
|
||||
WHERE token_id = ?
|
||||
""", (token_id,))
|
||||
today = str(date.today())
|
||||
# Get current stats
|
||||
cursor = await db.execute("SELECT today_date FROM token_stats WHERE token_id = ?", (token_id,))
|
||||
row = await cursor.fetchone()
|
||||
|
||||
# If date changed, reset today's error count
|
||||
if row and row[0] != today:
|
||||
await db.execute("""
|
||||
UPDATE token_stats
|
||||
SET error_count = error_count + 1,
|
||||
today_error_count = 1,
|
||||
today_date = ?,
|
||||
last_error_at = CURRENT_TIMESTAMP
|
||||
WHERE token_id = ?
|
||||
""", (today, token_id))
|
||||
else:
|
||||
# Same day, just increment both
|
||||
await db.execute("""
|
||||
UPDATE token_stats
|
||||
SET error_count = error_count + 1,
|
||||
today_error_count = today_error_count + 1,
|
||||
today_date = ?,
|
||||
last_error_at = CURRENT_TIMESTAMP
|
||||
WHERE token_id = ?
|
||||
""", (today, token_id))
|
||||
await db.commit()
|
||||
|
||||
async def reset_error_count(self, token_id: int):
|
||||
|
||||
@@ -42,6 +42,10 @@ class TokenStats(BaseModel):
|
||||
video_count: int = 0
|
||||
error_count: int = 0
|
||||
last_error_at: Optional[datetime] = None
|
||||
today_image_count: int = 0
|
||||
today_video_count: int = 0
|
||||
today_error_count: int = 0
|
||||
today_date: Optional[str] = None
|
||||
|
||||
class Task(BaseModel):
|
||||
"""Task model"""
|
||||
|
||||
Reference in New Issue
Block a user