mirror of
https://github.com/Dvorinka/SpotifyRecAlg.git
synced 2026-06-04 12:33:03 +00:00
first commit
This commit is contained in:
@@ -0,0 +1,92 @@
|
||||
import logging
|
||||
|
||||
from flask_openapi3 import APIBlueprint, Tag
|
||||
from pydantic import BaseModel, Field
|
||||
|
||||
from swingmusic.api.apischemas import GenericLimitSchema
|
||||
|
||||
# DragonflyDB integration for homepage caching
|
||||
from swingmusic.db.dragonfly_client import DragonflyCache
|
||||
from swingmusic.lib.home.get_recently_played import get_recently_played
|
||||
from swingmusic.lib.home.recentlyadded import get_recently_added_items
|
||||
from swingmusic.store.homepage import HomepageStore
|
||||
from swingmusic.utils.auth import get_current_userid
|
||||
|
||||
logger = logging.getLogger(__name__)
|
||||
|
||||
bp_tag = Tag(name="Home", description="Homepage items")
|
||||
api = APIBlueprint("home", __name__, url_prefix="/nothome", abp_tags=[bp_tag])
|
||||
|
||||
# Homepage cache with 5-minute TTL (homepage content changes frequently)
|
||||
homepage_cache = DragonflyCache("homepage")
|
||||
|
||||
|
||||
def _get_homepage_cache_key(userid: int, limit: int) -> str:
|
||||
"""Generate cache key for homepage items"""
|
||||
return f"items:user:{userid}:limit:{limit}"
|
||||
|
||||
|
||||
def _try_get_cached_homepage(userid: int, limit: int) -> list | None:
|
||||
"""Try to get cached homepage items"""
|
||||
if not homepage_cache.client.is_available():
|
||||
return None
|
||||
|
||||
cache_key = _get_homepage_cache_key(userid, limit)
|
||||
cached = homepage_cache.get(cache_key)
|
||||
|
||||
if cached:
|
||||
logger.debug(f"Homepage cache hit for user {userid}")
|
||||
return cached
|
||||
|
||||
return None
|
||||
|
||||
|
||||
def _cache_homepage_items(userid: int, limit: int, items: list, ttl_minutes: int = 5):
|
||||
"""Cache homepage items with short TTL"""
|
||||
if not homepage_cache.client.is_available():
|
||||
return
|
||||
|
||||
cache_key = _get_homepage_cache_key(userid, limit)
|
||||
ttl_seconds = ttl_minutes * 60
|
||||
homepage_cache.client.set(cache_key, items, ttl_seconds)
|
||||
logger.debug(f"Cached homepage for user {userid} for {ttl_minutes} minutes")
|
||||
|
||||
|
||||
@api.get("/recents/added")
|
||||
def get_recently_added(query: GenericLimitSchema):
|
||||
"""
|
||||
Get recently added
|
||||
"""
|
||||
return {"items": get_recently_added_items(query.limit)}
|
||||
|
||||
|
||||
@api.get("/recents/played")
|
||||
def get_recent_plays(query: GenericLimitSchema):
|
||||
"""
|
||||
Get recently played
|
||||
"""
|
||||
return {"items": get_recently_played(query.limit)}
|
||||
|
||||
|
||||
class HomepageItem(BaseModel):
|
||||
limit: int = Field(
|
||||
default=9, description="The max number of items per group to return"
|
||||
)
|
||||
|
||||
|
||||
@api.get("/")
|
||||
def homepage_items(query: HomepageItem):
|
||||
userid = get_current_userid()
|
||||
|
||||
# Try to get cached homepage first
|
||||
cached = _try_get_cached_homepage(userid, query.limit)
|
||||
if cached:
|
||||
return cached
|
||||
|
||||
# Generate fresh homepage items
|
||||
items = HomepageStore.get_homepage_items(limit=query.limit)
|
||||
|
||||
# Cache for 5 minutes (short TTL since homepage changes with plays)
|
||||
_cache_homepage_items(userid, query.limit, items, ttl_minutes=5)
|
||||
|
||||
return items
|
||||
Reference in New Issue
Block a user