commit 7837a38bdba270b7adbd2bc171f22864f6c619c5
parent 5da4623992d55e2e5356da183985b39754a2986c
Author: lash <dev@holbrook.no>
Date:   Sun, 26 Jun 2022 07:37:32 +0000
Add magic mime type feature
Diffstat:
4 files changed, 64 insertions(+), 14 deletions(-)
diff --git a/Cargo.toml b/Cargo.toml
@@ -10,8 +10,8 @@ edition = "2021"
 xattr = "0.2.2"
 #inotify = "0.8.0"
 regex = "1.5.5"
-rio_turtle = "~0.7.1"
-rio_api = "~0.7.1"
+#rio_turtle = "~0.7.1"
+#rio_api = "~0.7.1"
 hex = "^0.4"
 mime = "^0.3.13"
 unic-langid-impl = "^0.9.0"
@@ -25,11 +25,19 @@ urn = "^0.4.0"
 [dev-dependencies]
 tempfile = "^3.3.0"
 
-#[dependencies.rdf]
-#rio_turtle = "~0.7.1"
-#rio_api = "~0.7.1"
-#optional = true
+[dependencies.rio_turtle]
+version = "~0.7.1"
+optional = true
+
+[dependencies.rio_api]
+version = "^0.7.1"
+optional = true
+
+[dependencies.tree_magic]
+version = "^0.2.1"
+optional = true
 
-#[features]
-#dump_rdf = ["rdf"]
+[features]
+rdf = ["rio_turtle", "rio_api"]
 #dump_bibtex = ["biblatex"]
+magic = ["tree_magic"]
diff --git a/src/lib.rs b/src/lib.rs
@@ -4,9 +4,15 @@ pub mod meta;
 
 pub mod dc;
 
-//#[cfg(feature = "dump_rdf")]
+#[cfg(feature = "rdf")]
 pub mod rdf;
 
 #[cfg(test)]
 mod tests {
+    use env_logger;
+
+    #[test]
+    fn test_setup_env_logger() {
+        env_logger::init();
+    }
 }
diff --git a/src/meta.rs b/src/meta.rs
@@ -24,6 +24,9 @@ use biblatex::EntryType;
 use std::str::FromStr;
 use std::os::linux::fs::MetadataExt;
 
+#[cfg(feature = "magic")]
+use tree_magic;
+
 use crate::dc::{
     DCMetaData,
     DC_XATTR_TITLE,
@@ -260,6 +263,9 @@ impl MetaData {
             _ => {},
         }
 
+        #[cfg(feature = "magic")]
+        metadata.set_mime_magic(filepath);
+
         metadata
     }
 
@@ -343,6 +349,21 @@ impl MetaData {
         }
     }
 
+    #[cfg(feature = "magic")]
+    pub fn set_mime_magic(&mut self, path: &path::Path) {
+        if self.mime() == None {
+            let mime = tree_magic::from_filepath(path);
+            self.set_mime_str(&mime);
+            info!("magic set mime {}", mime);
+        }
+    }
+
+    pub fn from_path(p: &path::Path) -> Result<MetaData, std::io::Error> {
+        let f = File::open(&p).unwrap();
+        let mut m = MetaData::from_file(f).unwrap();
+        Ok(m)
+    }
+
     pub fn from_file(f: File) -> Result<MetaData, std::io::Error> {
         let mut m = MetaData::empty();
         //let f = File::open(path).unwrap();
@@ -381,7 +402,10 @@ mod tests {
     use std::path;
     use tempfile::NamedTempFile;
     use biblatex::EntryType;
-    use std::fs::File;
+    use std::fs::{
+        File,
+        write
+    };
     use env_logger;
 
     #[test]
@@ -420,8 +444,6 @@ mod tests {
 
     #[test]
     fn test_metadata_file() {
-        env_logger::init();
-
         let f = File::open("testdata/meta.txt").unwrap();
         let m_check = MetaData::from_file(f).unwrap();
         assert_eq!(m_check.title(), "foo");
@@ -431,4 +453,20 @@ mod tests {
         assert_eq!(m_check.mime().unwrap(), "text/plain");
         assert_eq!(m_check.language().unwrap(), "nb-NO");
     }
+
+    #[test]
+    fn test_metadata_xattr_magic() {
+        let s = path::Path::new("testdata/bitcoin.pdf");
+        let meta = MetaData::from_xattr(s);
+
+        #[cfg(feature = "magic")]
+        {
+            assert_eq!(meta.mime().unwrap(), "application/pdf");
+            let f = NamedTempFile::new_in(".").unwrap();
+            let fp = f.path();
+            write(&f, &[0, 1, 2, 3]);
+            let meta_empty = MetaData::from_xattr(fp);
+            assert_eq!(meta_empty.mime().unwrap(), "application/octet-stream"); 
+        }
+    }
 }
diff --git a/src/rdf.rs b/src/rdf.rs
@@ -213,8 +213,6 @@ mod tests {
 
     #[test]
     fn test_turtle_read() {
-        env_logger::init();
-
         let f = File::open("testdata/meta.ttl").unwrap();
         read(&f);
     }