Send timestamp from filename for Memories endpoint

This commit is contained in:
Cameron
2025-12-25 23:32:00 -05:00
parent ae0886cd2e
commit be281130d5

View File

@@ -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<Utc> = 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<Utc> = 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<FixedOffset>,
) -> (Option<i64>, Option<i64>) {
let created = metadata.created().ok().map(|t| {
) -> Option<i64> {
// 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<Utc> = 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<Utc> = 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<DateTime<FixedOffset>> {
@@ -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<Utc> = t.into();
if let Some(tz) = client_timezone {
utc.with_timezone(tz).timestamp()
} else {
utc.timestamp()
}
});
Some((
MemoryItem {