Skip to main content

binocular/preview/media/
types.rs

1#[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}