move recently added to routines

This commit is contained in:
cwilvx
2024-11-17 20:08:04 +03:00
parent 498d0688b0
commit 333fd6603f
14 changed files with 554 additions and 213 deletions
+69 -23
View File
@@ -1,11 +1,11 @@
from abc import ABC
from dataclasses import dataclass
from typing import Any
from app.lib.home.recentlyplayed import recover_recently_played_items
from app.models.mix import Mix
from app.utils.auth import get_current_userid
@dataclass
class HomepageEntry(ABC):
"""
Base class for all homepage entries.
@@ -15,20 +15,19 @@ class HomepageEntry(ABC):
title: str
description: str
items: dict[int, dict[str, Any]]
items: dict[int, Any]
def __init__(self, title: str, description: str):
self.title = title
self.description = description
def get_items(self, userid: int):
def get_items(self, userid: int, limit: int | None = None):
"""
Return usable items for the homepage.
"""
...
@dataclass
class MixHomepageEntry(HomepageEntry):
"""
A homepage entry for mixes.
@@ -62,26 +61,77 @@ class MixHomepageEntry(HomepageEntry):
}
class RecentlyPlayedHomepageEntry(HomepageEntry):
"""
A homepage entry for recently played.
"""
items: dict[int, list[dict[str, Any]]]
def __init__(self, title: str, description: str = ""):
super().__init__(title, description)
self.items = {}
def get_items(self, userid: int, limit: int | None = None):
items = self.items.get(userid, [])[:limit]
return {
"title": self.title,
"description": self.description,
"items": recover_recently_played_items(items),
}
class RecentlyAddedHomepageEntry(RecentlyPlayedHomepageEntry):
"""
A homepage entry for recently added.
"""
def get_items(self, userid: int, limit: int | None = None):
return super().get_items(0, limit)
class TopStreamedHomepageEntry(RecentlyPlayedHomepageEntry):
"""
A homepage entry for top streamed.
"""
# NOTE: This extends RecentlyPlayedHomepageEntry because
# the shape of the data is the same.
pass
class HomepageStore:
"""
Stores the homepage items.
"""
entries = {
entries: dict[str, HomepageEntry] = {
"recently_played": RecentlyPlayedHomepageEntry(
title="Recently played",
),
"artist_mixes": MixHomepageEntry(
title="Artist mixes for you",
description="Based on artists you have been listening to",
),
"top_streamed_weekly_artists": TopStreamedHomepageEntry(
title="Top artists this week",
description="Your most played artists since Monday",
),
"top_streamed_monthly_artists": TopStreamedHomepageEntry(
title="Top artists this month",
description="Your most played artists since the start of the month",
),
"recently_added": RecentlyAddedHomepageEntry(
title="Recently added",
description="New music added to your library",
),
}
@classmethod
def set_mixes(cls, mixes: list[Mix], mixkey: str, userid: int | None = None):
idmap = {mix.id[1:]: mix for mix in mixes}
cls.entries[mixkey].items[userid or get_current_userid()] = idmap
@classmethod
def get_mixes(cls, mixkey: str, limit: int | None = 9):
return cls.entries[mixkey].get_items(get_current_userid(), limit)
def set_mixes(cls, items: list[Any], entrykey: str, userid: int | None = None):
idmap = {item.id[1:]: item for item in items}
cls.entries[entrykey].items[userid or get_current_userid()] = idmap
@classmethod
def get_mix(cls, mixkey: str, mixid: str):
@@ -89,14 +139,10 @@ class HomepageStore:
return mix.to_full_dict() if mix else None
@classmethod
def get_mix_by_sourcehash(cls, sourcehash: str):
return next(
(
mix
for mix in cls.entries["artist_mixes"]
.items.get(get_current_userid(), {})
.values()
if mix.sourcehash == sourcehash
),
None,
)
def get_homepage_items(cls, limit: int):
# return a dict of entry name to entry items
return [
{entry: cls.entries[entry].get_items(get_current_userid(), limit)}
for entry in cls.entries.keys()
if len(cls.entries[entry].items)
]