1use std::fmt::Formatter;
2
3use std::fmt::Display;
4
5use crate::MediaID;
6
7#[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 = 0,
23 Series = 1,
25 Season = 2,
27 Episode = 3,
29 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#[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 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}