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] = {}