Files
musicseerr/backend/api/v1/schemas/home.py
T
2026-04-03 15:53:00 +01:00

172 lines
4.3 KiB
Python

from api.v1.schemas.common import GenreArtistMap, IntegrationStatus
from api.v1.schemas.weekly_exploration import WeeklyExplorationSection
from infrastructure.msgspec_fastapi import AppStruct
class HomeArtist(AppStruct):
name: str
mbid: str | None = None
image_url: str | None = None
listen_count: int | None = None
in_library: bool = False
source: str | None = None
class HomeAlbum(AppStruct):
name: str
mbid: str | None = None
artist_name: str | None = None
artist_mbid: str | None = None
image_url: str | None = None
release_date: str | None = None
listen_count: int | None = None
in_library: bool = False
requested: bool = False
source: str | None = None
class HomeTrack(AppStruct):
name: str
mbid: str | None = None
artist_name: str | None = None
artist_mbid: str | None = None
album_name: str | None = None
listen_count: int | None = None
listened_at: str | None = None
image_url: str | None = None
class HomeGenre(AppStruct):
name: str
listen_count: int | None = None
artist_count: int | None = None
artist_mbid: str | None = None
class HomeSection(AppStruct):
title: str
type: str
items: list[HomeArtist | HomeAlbum | HomeTrack | HomeGenre] = []
source: str | None = None
fallback_message: str | None = None
connect_service: str | None = None
class ServicePrompt(AppStruct):
service: str
title: str
description: str
icon: str
color: str
features: list[str] = []
class HomeIntegrationStatus(IntegrationStatus):
localfiles: bool = False
class DiscoverPreview(AppStruct):
seed_artist: str
seed_artist_mbid: str
items: list[HomeArtist] = []
class HomeResponse(AppStruct):
recently_added: HomeSection | None = None
library_artists: HomeSection | None = None
library_albums: HomeSection | None = None
recommended_artists: HomeSection | None = None
trending_artists: HomeSection | None = None
popular_albums: HomeSection | None = None
recently_played: HomeSection | None = None
top_genres: HomeSection | None = None
genre_list: HomeSection | None = None
fresh_releases: HomeSection | None = None
favorite_artists: HomeSection | None = None
your_top_albums: HomeSection | None = None
weekly_exploration: WeeklyExplorationSection | None = None
service_prompts: list[ServicePrompt] = []
integration_status: HomeIntegrationStatus | None = None
genre_artists: GenreArtistMap = {}
genre_artist_images: GenreArtistMap = {}
discover_preview: DiscoverPreview | None = None
service_status: dict[str, str] | None = None
class GenreLibrarySection(AppStruct):
artists: list[HomeArtist] = []
albums: list[HomeAlbum] = []
artist_count: int = 0
album_count: int = 0
class GenrePopularSection(AppStruct):
artists: list[HomeArtist] = []
albums: list[HomeAlbum] = []
has_more_artists: bool = False
has_more_albums: bool = False
class GenreDetailResponse(AppStruct):
genre: str
library: GenreLibrarySection | None = None
popular: GenrePopularSection | None = None
artists: list[HomeArtist] = []
total_count: int | None = None
class TrendingTimeRange(AppStruct):
range_key: str
label: str
featured: HomeArtist | None = None
items: list[HomeArtist] = []
total_count: int = 0
class TrendingArtistsResponse(AppStruct):
this_week: TrendingTimeRange
this_month: TrendingTimeRange
this_year: TrendingTimeRange
all_time: TrendingTimeRange
class PopularTimeRange(AppStruct):
range_key: str
label: str
featured: HomeAlbum | None = None
items: list[HomeAlbum] = []
total_count: int = 0
class PopularAlbumsResponse(AppStruct):
this_week: PopularTimeRange
this_month: PopularTimeRange
this_year: PopularTimeRange
all_time: PopularTimeRange
class TrendingArtistsRangeResponse(AppStruct):
range_key: str
label: str
items: list[HomeArtist] = []
offset: int = 0
limit: int = 25
has_more: bool = False
class PopularAlbumsRangeResponse(AppStruct):
range_key: str
label: str
items: list[HomeAlbum] = []
offset: int = 0
limit: int = 25
has_more: bool = False
class GenreArtistResponse(AppStruct):
artist_mbid: str | None = None
class GenreArtistsBatchResponse(AppStruct):
genre_artists: dict[str, str | None] = {}