Skip to main content

ferrex_model/
media_type.rs

1use std::fmt::Formatter;
2
3use std::fmt::Display;
4
5use crate::MediaID;
6
7/// Simple enum for media types
8#[derive(Debug, Clone, Copy, PartialEq, Hash)]
9#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
10#[cfg_attr(
11    feature = "rkyv",
12    derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
13)]
14#[cfg_attr(feature = "rkyv", rkyv(derive(Debug, PartialEq, Eq)))]
15#[cfg_attr(feature = "sqlx", derive(sqlx::Type))]
16#[cfg_attr(
17    feature = "sqlx",
18    sqlx(type_name = "media_type", rename_all = "lowercase")
19)]
20pub enum ImageMediaType {
21    /// Movie media type
22    Movie = 0,
23    /// Series media type
24    Series = 1,
25    /// Season media type
26    Season = 2,
27    /// Episode media type
28    Episode = 3,
29    /// Person media type
30    Person = 4,
31}
32
33impl Display for ImageMediaType {
34    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
35        match self {
36            ImageMediaType::Movie => write!(f, "Movie"),
37            ImageMediaType::Series => write!(f, "Series"),
38            ImageMediaType::Season => write!(f, "Season"),
39            ImageMediaType::Episode => write!(f, "Episode"),
40            ImageMediaType::Person => write!(f, "Person"),
41        }
42    }
43}
44
45impl From<u16> for ImageMediaType {
46    fn from(value: u16) -> Self {
47        match value {
48            0 => ImageMediaType::Movie,
49            1 => ImageMediaType::Series,
50            2 => ImageMediaType::Season,
51            3 => ImageMediaType::Episode,
52            4 => ImageMediaType::Person,
53            _ => panic!("Invalid media type"),
54        }
55    }
56}
57
58impl ImageMediaType {
59    pub const fn as_u16(self) -> u16 {
60        match self {
61            ImageMediaType::Movie => 0,
62            ImageMediaType::Series => 1,
63            ImageMediaType::Season => 2,
64            ImageMediaType::Episode => 3,
65            ImageMediaType::Person => 4,
66        }
67    }
68}
69
70/// Media types supported by the card system
71#[derive(Debug, Clone, Copy, PartialEq, Hash, Default)]
72#[cfg_attr(feature = "serde", derive(serde::Serialize, serde::Deserialize))]
73#[cfg_attr(
74    feature = "rkyv",
75    derive(rkyv::Archive, rkyv::Serialize, rkyv::Deserialize)
76)]
77#[cfg_attr(feature = "rkyv", rkyv(derive(Debug, PartialEq, Eq)))]
78#[cfg_attr(feature = "sqlx", derive(sqlx::Type))]
79#[cfg_attr(
80    feature = "sqlx",
81    sqlx(type_name = "media_type", rename_all = "lowercase")
82)]
83pub enum VideoMediaType {
84    #[default]
85    Movie = 0,
86    Series = 1,
87    Season = 2,
88    Episode = 3,
89}
90
91impl VideoMediaType {
92    /// Get the default fallback icon/emoji for this media type
93    pub fn default_icon(&self) -> &'static str {
94        match self {
95            VideoMediaType::Movie => "🎬",
96            VideoMediaType::Series => "📺",
97            VideoMediaType::Season => "📺",
98            VideoMediaType::Episode => "🎞️",
99        }
100    }
101}
102
103impl Display for VideoMediaType {
104    fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
105        match self {
106            VideoMediaType::Movie => write!(f, "Movie"),
107            VideoMediaType::Series => write!(f, "Series"),
108            VideoMediaType::Season => write!(f, "Season"),
109            VideoMediaType::Episode => write!(f, "Episode"),
110        }
111    }
112}
113
114impl From<u16> for VideoMediaType {
115    fn from(value: u16) -> Self {
116        match value {
117            0 => VideoMediaType::Movie,
118            1 => VideoMediaType::Series,
119            2 => VideoMediaType::Season,
120            3 => VideoMediaType::Episode,
121            _ => panic!("Invalid VideoMediaType"),
122        }
123    }
124}
125
126impl VideoMediaType {
127    pub const fn as_u16(self) -> u16 {
128        match self {
129            VideoMediaType::Movie => 0,
130            VideoMediaType::Series => 1,
131            VideoMediaType::Season => 2,
132            VideoMediaType::Episode => 3,
133        }
134    }
135}
136impl From<MediaID> for VideoMediaType {
137    fn from(value: MediaID) -> Self {
138        match value {
139            MediaID::Movie(_) => VideoMediaType::Movie,
140            MediaID::Series(_) => VideoMediaType::Series,
141            MediaID::Season(_) => VideoMediaType::Season,
142            MediaID::Episode(_) => VideoMediaType::Episode,
143        }
144    }
145}