From ea38665507affeb34dc745d9947c630ba9c800f8 Mon Sep 17 00:00:00 2001 From: Eguzki Astiz Lezaun Date: Wed, 25 Sep 2024 22:59:35 +0200 Subject: [PATCH] wip --- src/date_parser.rs | 30 +++++++++++++++++++----------- src/datetime_tag_parser.rs | 7 +++++-- src/stats.rs | 5 ++--- 3 files changed, 26 insertions(+), 16 deletions(-) diff --git a/src/date_parser.rs b/src/date_parser.rs index 7c8318e..1fd1d47 100644 --- a/src/date_parser.rs +++ b/src/date_parser.rs @@ -1,20 +1,20 @@ -use chrono::{DateTime, Utc}; +use chrono::{DateTime, NaiveDate, Utc}; use lazy_static::lazy_static; use regex::Regex; +use std::str::FromStr; // https://github.com/waltzofpearls/dateparser/blob/main/dateparser/src/lib.rs // https://github.com/waltzofpearls/dateparser/blob/main/dateparser/src/datetime.rs#L26 -pub fn parse(input: &str) -> Result, String> { +pub fn parse(input: &str) -> Option> { img_yyyymmdd(input) - .or_else(|| yyyymmdd(input)) - .unwrap_or_else(|| Err(format!("{} did not match any formats.", input))) } -fn img_yyyymmdd(input: &str) -> Option, String>> { +fn img_yyyymmdd(input: &str) -> Option> { lazy_static! { static ref RE: Regex = - Regex::new(r"^IMG-(?P[0-9]{4})(?P[0-9]{2})(?P
[0-9]{2})$",).unwrap(); + Regex::new(r"^(IMG[-_])*(?P[0-9]{4})(?P[0-9]{2})(?P
[0-9]{2}).*$",) + .unwrap(); } if !RE.is_match(input) { @@ -24,14 +24,22 @@ fn img_yyyymmdd(input: &str) -> Option, String>> { if let Some(caps) = RE.captures(input) { if let Some(matched_yyyy) = caps.name("yyyy") { if let Some(matched_mm) = caps.name("mm") { - if let Some(matched_dd) = caps.name("dd") {} + if let Some(matched_dd) = caps.name("dd") { + return Some( + NaiveDate::from_ymd_opt( + FromStr::from_str(matched_yyyy.as_str()).unwrap(), + FromStr::from_str(matched_mm.as_str()).unwrap(), + FromStr::from_str(matched_dd.as_str()).unwrap(), + ) + .unwrap() + .and_hms_milli_opt(0, 0, 0, 0) + .unwrap() + .and_utc(), + ); + } } } } None } - -fn yyyymmdd(input: &str) -> Option, String>> { - None -} diff --git a/src/datetime_tag_parser.rs b/src/datetime_tag_parser.rs index 93feea6..4b6ecb9 100644 --- a/src/datetime_tag_parser.rs +++ b/src/datetime_tag_parser.rs @@ -1,5 +1,5 @@ use chrono::{NaiveDate, NaiveDateTime, NaiveTime}; -use exif::{DateTime, In, Tag, Value}; +use exif::{DateTime, Error, In, Tag, Value}; use std::fs::File; use std::path::Path; @@ -62,6 +62,9 @@ pub fn captures(path: &Path) -> Result>, St // } //} } - Err(e) => Err(e.to_string()), + Err(e) => match e { + Error::NotFound(_) => Ok(None), + _ => Err(e.to_string()), + }, } } diff --git a/src/stats.rs b/src/stats.rs index 733b711..c10c346 100644 --- a/src/stats.rs +++ b/src/stats.rs @@ -62,7 +62,7 @@ impl FromIterator for Stats { None => { s.num_files_missing_datetime_tag += 1; match crate::date_parser::parse(i.file_name().to_str().unwrap()) { - Ok(tag) => match datetime_tag_writer::write_tag(i.path(), tag) { + 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:?}"); @@ -72,8 +72,7 @@ impl FromIterator for Stats { continue; } }, - Err(e) => { - println!("[ERROR] parsing filename: {e:?}"); + None => { s.num_files_failed_filename_parsing += 1; s.filenames_name_unparseable .push(i.path().display().to_string());