Menu
BifrOSt-Apps
publicLatest change f67fd8437552caf5eb9371b0012e81d27c807ca3 - Add native RÚV television application by Ólafur Búi Ólafsson
use chrono::{DateTime, FixedOffset};
use std::error::Error;
use std::fmt;
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Article {
pub title: String,
pub url: String,
pub author: Option<String>,
pub published: Option<DateTime<FixedOffset>>,
pub body: String,
pub image_url: Option<String>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct VodShelf {
pub title: String,
pub slug: String,
pub programs: Vec<ProgramCard>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ProgramCard {
pub program_id: i64,
pub title: String,
pub foreign_title: Option<String>,
pub description: String,
pub image_url: Option<String>,
pub episode_id: Option<String>,
pub episode_title: Option<String>,
pub rating: Option<u8>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Program {
pub program_id: i64,
pub title: String,
pub foreign_title: Option<String>,
pub description: String,
pub image_url: Option<String>,
pub episodes: Vec<Episode>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Episode {
pub id: String,
pub title: String,
pub description: String,
pub duration_seconds: Option<u64>,
pub first_run: Option<DateTime<FixedOffset>>,
pub scope: Option<String>,
pub stream_url: Option<String>,
pub image_url: Option<String>,
pub rating: Option<u8>,
pub subtitles: Vec<Subtitle>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct Subtitle {
pub name: String,
pub url: String,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash)]
pub enum Channel {
Ruv,
Ruv2,
}
impl Channel {
pub const fn slug(self) -> &'static str {
match self {
Self::Ruv => "ruv",
Self::Ruv2 => "ruv2",
}
}
pub const fn title(self) -> &'static str {
match self {
Self::Ruv => "RÚV",
Self::Ruv2 => "RÚV 2",
}
}
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct ScheduleEvent {
pub id: i64,
pub title: String,
pub subtitle: Option<String>,
pub description: String,
pub start: DateTime<FixedOffset>,
pub end: Option<DateTime<FixedOffset>>,
pub image_url: Option<String>,
pub program_id: Option<i64>,
pub episode_id: Option<String>,
pub is_live: bool,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct SearchResults {
pub articles: Vec<Article>,
pub programs: Vec<ProgramCard>,
}
#[derive(Debug, Clone, PartialEq, Eq)]
pub struct HomeData {
pub articles: Vec<Article>,
pub shelves: Vec<VodShelf>,
}
#[derive(Debug, Clone, Copy, PartialEq, Eq)]
pub enum AppError {
Network,
InvalidResponse,
ResponseTooLarge,
UntrustedUrl,
NotFound,
}
impl fmt::Display for AppError {
fn fmt(&self, formatter: &mut fmt::Formatter<'_>) -> fmt::Result {
let text = match self {
Self::Network => "Ekki náðist samband við RÚV.",
Self::InvalidResponse => "RÚV skilaði ógildum gögnum.",
Self::ResponseTooLarge => "Gögn frá RÚV voru of stór.",
Self::UntrustedUrl => "Ótraust veffang var stöðvað.",
Self::NotFound => "Efnið fannst ekki.",
};
formatter.write_str(text)
}
}
impl Error for AppError {}