Skip to content

Commit

Permalink
wip
Browse files Browse the repository at this point in the history
  • Loading branch information
eguzki committed Sep 22, 2024
1 parent b7d7926 commit da7670e
Show file tree
Hide file tree
Showing 3 changed files with 99 additions and 61 deletions.
62 changes: 62 additions & 0 deletions src/datetime_tag_writer.rs
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
use chrono::{DateTime, Utc};
use std::path::Path;

pub fn write_tag(path: &Path, dateTag: DateTime<Utc>) -> Result<(), String> {
//let file = File::open(i.path()).unwrap();
//let mut bufreader = std::io::BufReader::new(&file);
//let exifreader = exif::Reader::new();
//match exifreader.read_from_container(&mut bufreader) {
// Ok(exif) => {
// //for f in exif.fields() {
// // println!(
// // " {}/{}: {}",
// // f.ifd_num.index(),
// // f.tag,
// // f.display_value().with_unit(&exif)
// // );
// // println!(" {:?}", f.value);
// //}
// // To parse a DateTime-like field, `DateTime::from_ascii` can be used.
// if let Some(field) = exif.get_field(Tag::DateTime, In::PRIMARY) {
// match field.value {
// Value::Ascii(ref vec) if !vec.is_empty() => {
// if let Ok(datetime) = DateTime::from_ascii(&vec[0]) {
// println!("Year of DateTime is {}.", datetime.year);
// }
// }
// _ => {}
// }
// }
// }
// Err(e) => match &e {
// exif::Error::NotFound(msg) => println!("No Exif data found: {msg:?}"),
// other_error => println!("error parsing metadata: {other_error:?}"),
// },
//}
//
//let exif = exifreader.read_from_container(&mut bufreader).unwrap();

//match Metadata::new_from_path(i.path()) {
// Ok(metadata) => {
// println!("=== HELLO!");
// for tag in metadata.data() {
// println!("{:?}", tag);
// }
// }
// Err(e) => println!("error parsing metadata: {e:?}"),
//}

//match p.captures(i.file_name().to_str().unwrap()) {
// None => {
// s.num_skipped_files += 1;
// s.skipped_files
// .push(String::from(i.path().to_str().unwrap()));
// }
// Some(date_time) => {
// s.num_parsed_files += 1;
// let mtime = FileTime::from_unix_time(date_time.timestamp(), 0);
// set_file_mtime(i.path().to_str().unwrap(), mtime).unwrap();
// }
//}
return Ok(());
}
1 change: 1 addition & 0 deletions src/main.rs
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
use clap::Parser;
use walkdir::{DirEntry, WalkDir};
mod datetime_tag_parser;
mod datetime_tag_writer;
mod parser;
mod stats;

Expand Down
97 changes: 36 additions & 61 deletions src/stats.rs
Original file line number Diff line number Diff line change
@@ -1,10 +1,7 @@
use crate::datetime_tag_parser;
use crate::datetime_tag_writer;
use crate::parser;
//use filetime::{set_file_mtime, FileTime};
//use little_exif::metadata::Metadata;
use exif::{DateTime, In, Tag, Value};
use serde::Serialize;
use std::fs::File;
use walkdir::DirEntry;

// Parsing stats
Expand All @@ -15,8 +12,11 @@ pub struct Stats {
num_files_failed_tag_parsing: u32,
num_files_missing_datetime_tag: u32,
num_files_failed_filename_parsing: u32,
num_files_successfully_tagged: u32,
num_files_failed_tagging: u32,
filenames_tag_unparseable: Vec<String>,
filenames_name_unparseable: Vec<String>,
filenames_name_untaggeable: Vec<String>,
}

impl Stats {
Expand All @@ -27,16 +27,19 @@ impl Stats {
num_files_failed_tag_parsing: 0,
num_files_missing_datetime_tag: 0,
num_files_failed_filename_parsing: 0,
num_files_successfully_tagged: 0,
num_files_failed_tagging: 0,
filenames_tag_unparseable: Vec::new(),
filenames_name_unparseable: Vec::new(),
filenames_name_untaggeable: Vec::new(),
}
}
}

impl FromIterator<DirEntry> for Stats {
fn from_iter<I: IntoIterator<Item = DirEntry>>(iter: I) -> Self {
let mut s = Stats::new();
let p = parser::Parser::new();
let filename_parser = parser::Parser::new();

for i in iter {
//full path: i.path().display()
Expand All @@ -45,68 +48,40 @@ impl FromIterator<DirEntry> for Stats {

println!("{} {}", i.path().display(), i.file_name().to_str().unwrap());

match datetime_tag_parser::captures(i.path()) {
let datetime_tag = match datetime_tag_parser::captures(i.path()) {
Ok(datetime_tag) => datetime_tag,
Err(e) => {
println!("[ERROR] parsing metadata: {e:?}");
s.num_files_failed_tag_parsing += 1;
s.filenames_tag_unparseable
.push(i.path().display().to_string());
continue;
}
};

match datetime_tag {
Some(_) => s.num_files_with_datetime_tag += 1,
None => {
s.num_files_missing_datetime_tag += 1;
}
}

let file = File::open(i.path()).unwrap();
let mut bufreader = std::io::BufReader::new(&file);
let exifreader = exif::Reader::new();
match exifreader.read_from_container(&mut bufreader) {
Ok(exif) => {
//for f in exif.fields() {
// println!(
// " {}/{}: {}",
// f.ifd_num.index(),
// f.tag,
// f.display_value().with_unit(&exif)
// );
// println!(" {:?}", f.value);
//}
// To parse a DateTime-like field, `DateTime::from_ascii` can be used.
if let Some(field) = exif.get_field(Tag::DateTime, In::PRIMARY) {
match field.value {
Value::Ascii(ref vec) if !vec.is_empty() => {
if let Ok(datetime) = DateTime::from_ascii(&vec[0]) {
println!("Year of DateTime is {}.", datetime.year);
}
match filename_parser.captures(i.file_name().to_str().unwrap()) {
Some(tag) => match datetime_tag_writer::write_tag(i.path(), tag) {
Ok(_) => s.num_files_successfully_tagged += 1,
Err(e) => {
println!("[ERROR] tagging metadata: {e:?}");
s.num_files_failed_tagging += 1;
s.filenames_name_untaggeable
.push(i.path().display().to_string());
continue;
}
_ => {}
},
None => {
s.num_files_failed_filename_parsing += 1;
s.filenames_name_unparseable
.push(i.path().display().to_string());
}
}
};
}
Err(e) => match &e {
exif::Error::NotFound(msg) => println!("No Exif data found: {msg:?}"),
other_error => println!("error parsing metadata: {other_error:?}"),
},
}
//let exif = exifreader.read_from_container(&mut bufreader).unwrap();

//match Metadata::new_from_path(i.path()) {
// Ok(metadata) => {
// println!("=== HELLO!");
// for tag in metadata.data() {
// println!("{:?}", tag);
// }
// }
// Err(e) => println!("error parsing metadata: {e:?}"),
//}

//match p.captures(i.file_name().to_str().unwrap()) {
// None => {
// s.num_skipped_files += 1;
// s.skipped_files
// .push(String::from(i.path().to_str().unwrap()));
// }
// Some(date_time) => {
// s.num_parsed_files += 1;
// let mtime = FileTime::from_unix_time(date_time.timestamp(), 0);
// set_file_mtime(i.path().to_str().unwrap(), mtime).unwrap();
// }
//}
};
}

s
Expand Down

0 comments on commit da7670e

Please sign in to comment.