Color is stored in participant's metadata. Using a hash of some participant's info allow to persist the color for logged-in participant without storing the color in db. Please feel free to tune the saturation and lightness range. Code is inspired by a tutorial found online.
78 lines
2.2 KiB
Python
78 lines
2.2 KiB
Python
"""
|
|
Utils functions used in the core app
|
|
"""
|
|
|
|
# ruff: noqa:S311
|
|
|
|
import json
|
|
import random
|
|
from typing import Optional
|
|
from uuid import uuid4
|
|
|
|
from django.conf import settings
|
|
|
|
from livekit.api import AccessToken, VideoGrants
|
|
|
|
|
|
def generate_color(identity: str) -> str:
|
|
"""Generates a consistent HSL color based on a given identity string.
|
|
|
|
The function seeds the random generator with the identity's hash,
|
|
ensuring consistent color output. The HSL format allows fine-tuned control
|
|
over saturation and lightness, empirically adjusted to produce visually
|
|
appealing and distinct colors. HSL is preferred over hex to constrain the color
|
|
range and ensure predictability.
|
|
"""
|
|
|
|
random.seed(hash(identity))
|
|
hue = random.randint(0, 360)
|
|
saturation = random.randint(50, 75)
|
|
lightness = random.randint(25, 60)
|
|
|
|
return f"hsl({hue}, {saturation}%, {lightness}%)"
|
|
|
|
|
|
def generate_token(room: str, user, username: Optional[str] = None) -> str:
|
|
"""Generate a LiveKit access token for a user in a specific room.
|
|
|
|
Args:
|
|
room (str): The name of the room.
|
|
user (User): The user which request the access token.
|
|
username (Optional[str]): The username to be displayed in the room.
|
|
If none, a default value will be used.
|
|
|
|
Returns:
|
|
str: The LiveKit JWT access token.
|
|
"""
|
|
video_grants = VideoGrants(
|
|
room=room,
|
|
room_join=True,
|
|
can_update_own_metadata=True,
|
|
can_publish_sources=[
|
|
"camera",
|
|
"microphone",
|
|
"screen_share",
|
|
"screen_share_audio",
|
|
],
|
|
)
|
|
|
|
if user.is_anonymous:
|
|
identity = str(uuid4())
|
|
default_username = "Anonymous"
|
|
else:
|
|
identity = str(user.sub)
|
|
default_username = str(user)
|
|
|
|
token = (
|
|
AccessToken(
|
|
api_key=settings.LIVEKIT_CONFIGURATION["api_key"],
|
|
api_secret=settings.LIVEKIT_CONFIGURATION["api_secret"],
|
|
)
|
|
.with_grants(video_grants)
|
|
.with_identity(identity)
|
|
.with_name(username or default_username)
|
|
.with_metadata(json.dumps({"color": generate_color(identity)}))
|
|
)
|
|
|
|
return token.to_jwt()
|