binocular/preview/media/
types.rs1#[derive(Clone, Copy, Debug, Eq, PartialEq)]
2pub enum MediaKind {
3 Audio,
4 Video,
5}
6
7pub struct MediaPreviewPayload {
8 pub text: ratatui::text::Text<'static>,
9 pub artwork_bytes: Option<Vec<u8>>,
10}
11
12#[derive(Default)]
13pub(crate) struct MediaMetadata {
14 pub title: Option<String>,
15 pub artist: Option<String>,
16 pub album: Option<String>,
17 pub genre: Option<String>,
18 pub composer: Option<String>,
19 pub track: Option<String>,
20 pub year: Option<String>,
21 pub duration: Option<String>,
22 pub bitrate: Option<String>,
23 pub sample_rate: Option<String>,
24 pub channels: Option<String>,
25 pub resolution: Option<String>,
26 pub codec: Option<String>,
27 pub frame_rate: Option<String>,
28 pub artwork: Option<ArtworkInfo>,
29}
30
31impl MediaMetadata {
32 pub fn merge(&mut self, other: MediaMetadata) {
33 merge_opt(&mut self.title, other.title);
34 merge_opt(&mut self.artist, other.artist);
35 merge_opt(&mut self.album, other.album);
36 merge_opt(&mut self.genre, other.genre);
37 merge_opt(&mut self.composer, other.composer);
38 merge_opt(&mut self.track, other.track);
39 merge_opt(&mut self.year, other.year);
40 merge_opt(&mut self.duration, other.duration);
41 merge_opt(&mut self.bitrate, other.bitrate);
42 merge_opt(&mut self.sample_rate, other.sample_rate);
43 merge_opt(&mut self.channels, other.channels);
44 merge_opt(&mut self.resolution, other.resolution);
45 merge_opt(&mut self.codec, other.codec);
46 merge_opt(&mut self.frame_rate, other.frame_rate);
47 if self.artwork.is_none() {
48 self.artwork = other.artwork;
49 }
50 }
51}
52
53pub(crate) fn merge_opt(slot: &mut Option<String>, incoming: Option<String>) {
54 if slot.is_none() {
55 *slot = incoming.filter(|s| !s.trim().is_empty());
56 }
57}
58
59#[derive(Clone)]
60pub(crate) struct ArtworkInfo {
61 pub mime: String,
62 pub size_bytes: usize,
63 pub dimensions: Option<(u32, u32)>,
64 pub data: Vec<u8>,
65}
66
67pub(crate) fn has_any_metadata(m: &MediaMetadata) -> bool {
68 m.title.is_some()
69 || m.artist.is_some()
70 || m.album.is_some()
71 || m.genre.is_some()
72 || m.composer.is_some()
73 || m.track.is_some()
74 || m.year.is_some()
75 || m.duration.is_some()
76 || m.bitrate.is_some()
77 || m.sample_rate.is_some()
78 || m.channels.is_some()
79 || m.resolution.is_some()
80 || m.codec.is_some()
81 || m.frame_rate.is_some()
82 || m.artwork.is_some()
83}