97 lines
2.4 KiB
Rust
97 lines
2.4 KiB
Rust
use serde::{Deserialize, Serialize};
|
|
|
|
#[derive(Debug, Clone, PartialEq, Eq, Serialize, Deserialize)]
|
|
#[serde(rename_all = "snake_case")]
|
|
pub enum ContentType {
|
|
Movie,
|
|
Episode,
|
|
Short,
|
|
}
|
|
|
|
#[derive(Debug, Clone, Default, Serialize, Deserialize)]
|
|
pub struct MediaFilter {
|
|
pub content_type: Option<ContentType>,
|
|
pub genres: Vec<String>,
|
|
pub decade: Option<u16>,
|
|
pub tags: Vec<String>,
|
|
pub min_duration_secs: Option<u32>,
|
|
pub max_duration_secs: Option<u32>,
|
|
pub collections: Vec<String>,
|
|
#[serde(default)]
|
|
pub series_names: Vec<String>,
|
|
pub search_term: Option<String>,
|
|
}
|
|
|
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
#[serde(rename_all = "snake_case")]
|
|
pub enum FillStrategy {
|
|
BestFit,
|
|
Sequential,
|
|
Random,
|
|
}
|
|
|
|
const DEFAULT_COOLDOWN_DAYS: u32 = 30;
|
|
const DEFAULT_MIN_AVAILABLE_RATIO: f32 = 0.2;
|
|
|
|
#[derive(Debug, Clone, Serialize, Deserialize)]
|
|
pub struct RotationPolicy {
|
|
pub cooldown_days: Option<u32>,
|
|
pub cooldown_generations: Option<u32>,
|
|
pub min_available_ratio: f32,
|
|
}
|
|
|
|
impl Default for RotationPolicy {
|
|
fn default() -> Self {
|
|
Self {
|
|
cooldown_days: Some(DEFAULT_COOLDOWN_DAYS),
|
|
cooldown_generations: None,
|
|
min_available_ratio: DEFAULT_MIN_AVAILABLE_RATIO,
|
|
}
|
|
}
|
|
}
|
|
|
|
#[derive(Debug, Clone, Copy, PartialEq, Eq, Hash, Serialize, Deserialize)]
|
|
#[serde(rename_all = "lowercase")]
|
|
pub enum Weekday {
|
|
Monday,
|
|
Tuesday,
|
|
Wednesday,
|
|
Thursday,
|
|
Friday,
|
|
Saturday,
|
|
Sunday,
|
|
}
|
|
|
|
impl From<chrono::Weekday> for Weekday {
|
|
fn from(w: chrono::Weekday) -> Self {
|
|
match w {
|
|
chrono::Weekday::Mon => Weekday::Monday,
|
|
chrono::Weekday::Tue => Weekday::Tuesday,
|
|
chrono::Weekday::Wed => Weekday::Wednesday,
|
|
chrono::Weekday::Thu => Weekday::Thursday,
|
|
chrono::Weekday::Fri => Weekday::Friday,
|
|
chrono::Weekday::Sat => Weekday::Saturday,
|
|
chrono::Weekday::Sun => Weekday::Sunday,
|
|
}
|
|
}
|
|
}
|
|
|
|
impl Weekday {
|
|
pub fn all() -> [Weekday; 7] {
|
|
// ISO week order: Monday first. Schedule engine depends on this ordering.
|
|
[
|
|
Weekday::Monday,
|
|
Weekday::Tuesday,
|
|
Weekday::Wednesday,
|
|
Weekday::Thursday,
|
|
Weekday::Friday,
|
|
Weekday::Saturday,
|
|
Weekday::Sunday,
|
|
]
|
|
}
|
|
}
|
|
|
|
#[cfg(test)]
|
|
#[path = "tests/scheduling.rs"]
|
|
mod tests;
|