Source code for nrk_psapi.models.channels
from __future__ import annotations
from dataclasses import dataclass, field
from datetime import datetime, timedelta
from mashumaro import field_options
from .catalog import Image, Links
from .common import BaseDataClassORJSONMixin, StrEnum
def parse_duration(time_str: str):
time_parts = time_str.split(":")
return timedelta(hours=int(time_parts[0]), minutes=int(time_parts[1]), seconds=int(time_parts[2]))
def serialize_timedelta(duration: timedelta): # pragma: no cover
total_seconds = int(duration.total_seconds())
hours = total_seconds // 3600
minutes = (total_seconds % 3600) // 60
seconds = total_seconds % 60
return f"{hours:02}:{minutes:02}:{seconds:02}"
[docs]
class ChannelType(StrEnum):
REGIONAL_CHANNEL = "regionalChannel"
DISTRICT_CHANNEL = "districtChannel"
[docs]
@dataclass
class ChannelImage(BaseDataClassORJSONMixin):
aspect_ratio: str = field(metadata=field_options(alias="aspectRatio"))
mime_type: str = field(metadata=field_options(alias="mimeType"))
is_default_image: bool = field(metadata=field_options(alias="isDefaultImage"))
images: list[Image]
[docs]
@dataclass
class ChannelEntryImages(BaseDataClassORJSONMixin):
main_key_art_image: ChannelImage | None = field(
default=None, metadata=field_options(alias="mainKeyArtImage")
)
backdrop_image: ChannelImage | None = field(default=None, metadata=field_options(alias="backdropImage"))
poster_image: ChannelImage | None = field(default=None, metadata=field_options(alias="posterImage"))
square_image: ChannelImage | None = field(default=None, metadata=field_options(alias="squareImage"))
[docs]
@dataclass
class ChannelEntry(BaseDataClassORJSONMixin):
title: str
program_id: str = field(metadata=field_options(alias="programId"))
image: ChannelEntryImages
actual_start: datetime = field(metadata=field_options(alias="actualStart"))
actual_end: datetime = field(metadata=field_options(alias="actualEnd"))
program_duration: timedelta = field(
metadata=field_options(
alias="programDuration",
deserialize=parse_duration,
serialize=serialize_timedelta,
)
)
duration: timedelta = field(
metadata=field_options(
deserialize=parse_duration,
serialize=serialize_timedelta,
)
)
series_id: str | None = None
[docs]
@dataclass
class DistrictChannel(BaseDataClassORJSONMixin):
parent: str
def __str__(self):
return self.parent
[docs]
@dataclass
class Channel(BaseDataClassORJSONMixin):
id: str
title: str
type: ChannelType
live_buffer_duration: timedelta = field(
metadata=field_options(
alias="liveBufferDuration",
deserialize=parse_duration,
serialize=serialize_timedelta,
)
)
image: ChannelImage
entries: list[ChannelEntry]
district_channel: DistrictChannel | None = field(
default=None, metadata=field_options(alias="districtChannel")
)
[docs]
@dataclass
class ChannelResponse(BaseDataClassORJSONMixin):
_links: Links
channel: Channel