From be281130d5420d0b5c10e43c030ea5d3d63acd50 Mon Sep 17 00:00:00 2001 From: Cameron Date: Thu, 25 Dec 2025 23:32:00 -0500 Subject: [PATCH] Send timestamp from filename for Memories endpoint --- src/memories.rs | 78 +++++++++++++++++++++++++------------------------ 1 file changed, 40 insertions(+), 38 deletions(-) diff --git a/src/memories.rs b/src/memories.rs index b01c56a..eccf737 100644 --- a/src/memories.rs +++ b/src/memories.rs @@ -130,8 +130,12 @@ fn get_file_date_info( // Read file metadata once let meta = std::fs::metadata(path).ok()?; - // Extract metadata timestamps - let metadata_created = meta.created().ok().map(|t| { + // Get created timestamp (tries filename first, then metadata) + let path_str = path.to_str()?; + let created = get_created_timestamp_with_fallback(path_str, &meta, client_timezone); + + // Get modified timestamp from metadata + let modified = meta.modified().ok().map(|t| { let utc: DateTime = t.into(); if let Some(tz) = client_timezone { utc.with_timezone(tz).timestamp() @@ -140,16 +144,7 @@ fn get_file_date_info( } }); - let metadata_modified = meta.modified().ok().map(|t| { - let utc: DateTime = t.into(); - if let Some(tz) = client_timezone { - utc.with_timezone(tz).timestamp() - } else { - utc.timestamp() - } - }); - - // Try to get date from filename + // Try to get date from filename for the NaiveDate if let Some(date_time) = path .file_name() .and_then(|filename| filename.to_str()) @@ -162,20 +157,13 @@ fn get_file_date_info( date_time.with_timezone(&Local).fixed_offset() }; - // Use the timestamp from the filename date - let created_ts = date_in_timezone.timestamp(); - debug!( "File date from file {:?} > {:?} = {:?}", path.file_name(), date_time, date_in_timezone ); - return Some(( - date_in_timezone.date_naive(), - Some(created_ts), - metadata_modified, - )); + return Some((date_in_timezone.date_naive(), created, modified)); } // Fall back to metadata if no date in filename @@ -189,7 +177,7 @@ fn get_file_date_info( }; trace!("Fallback metadata create date = {:?}", date_in_timezone); - Some((date_in_timezone, metadata_created, metadata_modified)) + Some((date_in_timezone, created, modified)) } /// Convert Unix timestamp to NaiveDate in client timezone @@ -208,30 +196,35 @@ fn timestamp_to_naive_date( Some(date) } -/// Extract created/modified timestamps from file metadata -fn extract_metadata_timestamps( +/// Get created timestamp, trying filename parsing first, then falling back to metadata +fn get_created_timestamp_with_fallback( + file_path: &str, metadata: &std::fs::Metadata, client_timezone: &Option, -) -> (Option, Option) { - let created = metadata.created().ok().map(|t| { +) -> Option { + // Try to extract date from filename first + if let Some(filename_date) = Path::new(file_path) + .file_name() + .and_then(|f| f.to_str()) + .and_then(extract_date_from_filename) + { + let timestamp = if let Some(tz) = client_timezone { + filename_date.with_timezone(tz).timestamp() + } else { + filename_date.timestamp() + }; + return Some(timestamp); + } + + // Fall back to metadata + metadata.created().ok().map(|t| { let utc: DateTime = t.into(); if let Some(tz) = client_timezone { utc.with_timezone(tz).timestamp() } else { utc.timestamp() } - }); - - let modified = metadata.modified().ok().map(|t| { - let utc: DateTime = t.into(); - if let Some(tz) = client_timezone { - utc.with_timezone(tz).timestamp() - } else { - utc.timestamp() - } - }); - - (created, modified) + }) } pub fn extract_date_from_filename(filename: &str) -> Option> { @@ -388,7 +381,16 @@ fn collect_exif_memories( // Get file metadata for created/modified timestamps let metadata = std::fs::metadata(&full_path).ok()?; - let (created, modified) = extract_metadata_timestamps(&metadata, client_timezone); + let created = + get_created_timestamp_with_fallback(file_path, &metadata, client_timezone); + let modified = metadata.modified().ok().map(|t| { + let utc: DateTime = t.into(); + if let Some(tz) = client_timezone { + utc.with_timezone(tz).timestamp() + } else { + utc.timestamp() + } + }); Some(( MemoryItem {