Source code for nrk_psapi.models.recommendations
from __future__ import annotations
from dataclasses import dataclass, field
from datetime import timedelta # noqa: TCH003
from enum import Enum
from isodate import duration_isoformat, parse_duration
from mashumaro import field_options
from mashumaro.config import BaseConfig
from mashumaro.types import Discriminator
from .catalog import Links, Titles, WebImage
from .common import BaseDataClassORJSONMixin, StrEnum
[docs]
class RecommendationType(str, Enum):
PODCAST = "podcast"
PODCAST_SEASON = "podcastSeason"
PROGRAM = "program"
SERIES = "series"
def __str__(self) -> str:
return str(self.value)
[docs]
class RecommendationContext(StrEnum):
"""Give different recommendations based on which context (front page, series page, etc.) the user is in."""
DEFAULT = "radio_viderenavigasjon_fra_program"
[docs]
@dataclass
class UpstreamSystemInfoPayload(BaseDataClassORJSONMixin):
id: str
name: str
brand: str
list_id: str = field(metadata=field_options(alias="list"))
position: int
variant: str
[docs]
@dataclass
class SnowplowSection(BaseDataClassORJSONMixin):
id: str
[docs]
@dataclass
class SnowplowContent(BaseDataClassORJSONMixin):
id: str
kind: str
source: str
[docs]
@dataclass
class Snowplow(BaseDataClassORJSONMixin):
title: str
section_index: int
image_id: str
recommendation_id: str
section: SnowplowSection
content: SnowplowContent
[docs]
@dataclass
class UpstreamSystemInfo(BaseDataClassORJSONMixin):
upstream_system: str = field(metadata=field_options(alias="upstreamSystem"))
payload: UpstreamSystemInfoPayload
[docs]
@dataclass
class RecommendedPodcast(BaseDataClassORJSONMixin):
id: str
titles: Titles
image: WebImage
number_of_episodes: int = field(metadata=field_options(alias="numberOfEpisodes"))
square_image: WebImage = field(metadata=field_options(alias="squareImage"))
[docs]
@dataclass
class RecommendedPodcastSeason(BaseDataClassORJSONMixin):
id: str
podcast_id: str = field(metadata=field_options(alias="podcastId"))
titles: Titles
image: WebImage
season_number: int = field(metadata=field_options(alias="seasonNumber"))
[docs]
@dataclass
class RecommendedSeries(BaseDataClassORJSONMixin):
id: str
titles: Titles
image: WebImage
number_of_episodes: int = field(metadata=field_options(alias="numberOfEpisodes"))
square_image: WebImage | None = field(default=None, metadata=field_options(alias="squareImage"))
[docs]
@dataclass
class RecommendedProgram(BaseDataClassORJSONMixin):
id: str
titles: Titles
image: WebImage
duration: timedelta = field(
metadata=field_options(deserialize=parse_duration, serialize=duration_isoformat)
)
square_image: WebImage | None = field(default=None, metadata=field_options(alias="squareImage"))
[docs]
@dataclass
class EmbeddedRecommendation(BaseDataClassORJSONMixin):
_links: Links
type: RecommendationType
upstream_system_info: UpstreamSystemInfo = field(metadata=field_options(alias="upstreamSystemInfo"))
class Config(BaseConfig):
discriminator = Discriminator(
field="type",
include_subtypes=True,
)
[docs]
@dataclass
class EmbeddedPodcastRecommendation(EmbeddedRecommendation):
type = RecommendationType.PODCAST
podcast: RecommendedPodcast
[docs]
@dataclass
class EmbeddedPodcastSeasonRecommendation(EmbeddedRecommendation):
type = RecommendationType.PODCAST_SEASON
podcast_season: RecommendedPodcastSeason = field(metadata=field_options(alias="podcastSeason"))
[docs]
@dataclass
class EmbeddedSeriesRecommendation(EmbeddedRecommendation):
type = RecommendationType.SERIES
series: RecommendedSeries
[docs]
@dataclass
class EmbeddedProgramRecommendation(EmbeddedRecommendation):
type = RecommendationType.PROGRAM
program: RecommendedProgram
[docs]
@dataclass
class Recommendation(BaseDataClassORJSONMixin):
_links: Links
recommendations: list[EmbeddedRecommendation] = field(
default_factory=list,
metadata=field_options(
alias="_embedded",
deserialize=lambda x: [EmbeddedRecommendation.from_dict(d) for d in x["recommendations"]],
),
)