25 lines
783 B
Python
25 lines
783 B
Python
from typing import Optional
|
|
import hmac
|
|
import hashlib
|
|
import time
|
|
import base64
|
|
import os
|
|
|
|
VIDEO_PROXY_SECRET = os.environ.get("VIDEO_PROXY_SECRET", "").encode()
|
|
|
|
|
|
def sign_video_id(video_id: Optional[str | bool]) -> str:
|
|
"""Generate a signed token for a video ID."""
|
|
if not VIDEO_PROXY_SECRET or not video_id:
|
|
return "" # Return empty if no secret configured
|
|
|
|
timestamp = int(time.time() * 1000) # milliseconds to match JS Date.now()
|
|
payload = f"{video_id}:{timestamp}"
|
|
signature = hmac.new(
|
|
VIDEO_PROXY_SECRET, payload.encode(), hashlib.sha256
|
|
).hexdigest()
|
|
|
|
token_data = f"{payload}:{signature}"
|
|
# base64url encode (no padding, to match JS base64url)
|
|
return base64.urlsafe_b64encode(token_data.encode()).decode().rstrip("=")
|