30 lines
1.2 KiB
Python
30 lines
1.2 KiB
Python
import time
|
|
from datetime import datetime
|
|
|
|
from sqlalchemy import select
|
|
from sqlalchemy.ext.asyncio import AsyncSession
|
|
|
|
from app.models.generation_record import GenerationRecord
|
|
from app.utils.security import encrypt_temp_token, decrypt_temp_token
|
|
|
|
|
|
async def generate_temp_url(db: AsyncSession, record: GenerationRecord) -> str:
|
|
"""Generate a temporary encrypted URL for video access (1 hour expiry)."""
|
|
token = encrypt_temp_token(record.id, expires_in=3600)
|
|
record.video_url_expires_at = datetime.now().replace(second=0, microsecond=0)
|
|
# We store just the token, the full URL is constructed by the frontend
|
|
return f"/api/generation-records/{record.id}/video?token={token}"
|
|
|
|
|
|
async def validate_and_get_record_id(token: str) -> str | None:
|
|
"""Validate a temp URL token and return the record_id if valid."""
|
|
return decrypt_temp_token(token)
|
|
|
|
|
|
async def get_video_stream_url(db: AsyncSession, record_id: str) -> str | None:
|
|
"""Get the actual video URL for a record (for proxying/redirecting)."""
|
|
result = await db.execute(
|
|
select(GenerationRecord.video_url).where(GenerationRecord.id == record_id)
|
|
)
|
|
return result.scalar_one_or_none()
|