immich_lib/models/
exif.rs1use serde::{Deserialize, Serialize};
4
5#[derive(Debug, Clone, Deserialize, Serialize)]
9#[serde(rename_all = "camelCase")]
10pub struct ExifInfo {
11 pub latitude: Option<f64>,
13
14 pub longitude: Option<f64>,
16
17 pub city: Option<String>,
19
20 pub state: Option<String>,
22
23 pub country: Option<String>,
25
26 pub time_zone: Option<String>,
28
29 pub date_time_original: Option<String>,
31
32 pub make: Option<String>,
34
35 pub model: Option<String>,
37
38 pub lens_model: Option<String>,
40
41 pub exposure_time: Option<String>,
43
44 pub f_number: Option<f64>,
46
47 pub focal_length: Option<f64>,
49
50 pub iso: Option<u32>,
52
53 pub exif_image_width: Option<u32>,
55
56 pub exif_image_height: Option<u32>,
58
59 pub file_size_in_byte: Option<u64>,
61
62 pub description: Option<String>,
64
65 pub rating: Option<u8>,
67
68 #[serde(default)]
70 pub orientation: Option<String>,
71
72 #[serde(default)]
74 pub modify_date: Option<String>,
75
76 #[serde(default)]
78 pub projection_type: Option<String>,
79}
80
81impl ExifInfo {
82 pub fn has_gps(&self) -> bool {
84 self.latitude.is_some() && self.longitude.is_some()
85 }
86
87 pub fn has_camera_info(&self) -> bool {
89 self.make.is_some() || self.model.is_some()
90 }
91
92 pub fn has_timezone(&self) -> bool {
94 self.time_zone.is_some()
95 }
96
97 pub fn has_capture_time(&self) -> bool {
99 self.date_time_original.is_some()
100 }
101
102 pub fn has_lens_info(&self) -> bool {
104 self.lens_model.is_some()
105 }
106
107 pub fn has_location(&self) -> bool {
109 self.city.is_some() || self.country.is_some()
110 }
111}