feature/memories #35

Merged
cameron merged 11 commits from feature/memories into master 2025-08-16 16:42:39 +00:00
Showing only changes of commit 93957bf389 - Show all commits

View File

@@ -2,7 +2,7 @@ use actix_web::web::Data;
use actix_web::{get, web, HttpRequest, HttpResponse, Responder}; use actix_web::{get, web, HttpRequest, HttpResponse, Responder};
use chrono::LocalResult::{Ambiguous, Single}; use chrono::LocalResult::{Ambiguous, Single};
use chrono::{DateTime, Datelike, FixedOffset, Local, LocalResult, NaiveDate, TimeZone, Utc}; use chrono::{DateTime, Datelike, FixedOffset, Local, LocalResult, NaiveDate, TimeZone, Utc};
use log::{debug, info, trace, warn}; use log::{debug, trace, warn};
use opentelemetry::trace::{Span, Status, Tracer}; use opentelemetry::trace::{Span, Status, Tracer};
use opentelemetry::KeyValue; use opentelemetry::KeyValue;
use serde::{Deserialize, Serialize}; use serde::{Deserialize, Serialize};
@@ -111,12 +111,8 @@ fn get_file_date_info(
} }
fn extract_date_from_filename(filename: &str) -> Option<DateTime<FixedOffset>> { fn extract_date_from_filename(filename: &str) -> Option<DateTime<FixedOffset>> {
// 1. Screenshot format: Screenshot_2014-06-01-20-44-50.png let build_date_from_ymd_capture =
if let Some(captures) = |captures: &regex::Captures| -> Option<DateTime<FixedOffset>> {
regex::Regex::new(r"Screenshot_(\d{4})-(\d{2})-(\d{2})-(\d{2})-(\d{2})-(\d{2})")
.ok()?
.captures(filename)
{
let year = captures.get(1)?.as_str().parse::<i32>().ok()?; let year = captures.get(1)?.as_str().parse::<i32>().ok()?;
let month = captures.get(2)?.as_str().parse::<u32>().ok()?; let month = captures.get(2)?.as_str().parse::<u32>().ok()?;
let day = captures.get(3)?.as_str().parse::<u32>().ok()?; let day = captures.get(3)?.as_str().parse::<u32>().ok()?;
@@ -124,68 +120,51 @@ fn extract_date_from_filename(filename: &str) -> Option<DateTime<FixedOffset>> {
let min = captures.get(5)?.as_str().parse::<u32>().ok()?; let min = captures.get(5)?.as_str().parse::<u32>().ok()?;
let sec = captures.get(6)?.as_str().parse::<u32>().ok()?; let sec = captures.get(6)?.as_str().parse::<u32>().ok()?;
return match Local.from_local_datetime( match Local.from_local_datetime(
&NaiveDate::from_ymd_opt(year, month, day)?.and_hms_opt(hour, min, sec)?, &NaiveDate::from_ymd_opt(year, month, day)?.and_hms_opt(hour, min, sec)?,
) { ) {
Single(dt) => Some(dt.fixed_offset()), Single(dt) => Some(dt.fixed_offset()),
Ambiguous(early_dt, _) => Some(early_dt.fixed_offset()), Ambiguous(early_dt, _) => Some(early_dt.fixed_offset()),
LocalResult::None => { LocalResult::None => {
warn!("Weird local date: {:?}", filename); warn!("Weird local date: {:?}", filename);
return None; None
}
} }
}; };
// 1. Screenshot format: Screenshot_2014-06-01-20-44-50.png
if let Some(captures) =
regex::Regex::new(r"Screenshot_(\d{4})-(\d{2})-(\d{2})-(\d{2})-(\d{2})-(\d{2})")
.ok()?
.captures(filename)
.and_then(|c| build_date_from_ymd_capture(&c))
{
return Some(captures);
} }
// 2. Dash format: 2015-01-09_02-15-15.jpg // 2. Dash format: 2015-01-09_02-15-15.jpg
if let Some(captures) = regex::Regex::new(r"(\d{4})-(\d{2})-(\d{2})_(\d{2})-(\d{2})-(\d{2})") if let Some(captures) = regex::Regex::new(r"(\d{4})-(\d{2})-(\d{2})_(\d{2})-(\d{2})-(\d{2})")
.ok()? .ok()?
.captures(filename) .captures(filename)
.and_then(|c| build_date_from_ymd_capture(&c))
{ {
let year = captures.get(1)?.as_str().parse::<i32>().ok()?; return Some(captures);
let month = captures.get(2)?.as_str().parse::<u32>().ok()?;
let day = captures.get(3)?.as_str().parse::<u32>().ok()?;
let hour = captures.get(4)?.as_str().parse::<u32>().ok()?;
let min = captures.get(5)?.as_str().parse::<u32>().ok()?;
let sec = captures.get(6)?.as_str().parse::<u32>().ok()?;
return match Local.from_local_datetime(
&NaiveDate::from_ymd_opt(year, month, day)?.and_hms_opt(hour, min, sec)?,
) {
Single(dt) => Some(dt.fixed_offset()),
Ambiguous(early_dt, _) => Some(early_dt.fixed_offset()),
LocalResult::None => {
warn!("Weird local date: {:?}", filename);
return None;
}
};
} }
// 3. Compact format: 20140927101712.jpg // 3. Compact format: 20140927101712.jpg
if let Some(captures) = regex::Regex::new(r"(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})") if let Some(captures) = regex::Regex::new(r"(\d{4})(\d{2})(\d{2})(\d{2})(\d{2})(\d{2})")
.ok()? .ok()?
.captures(filename) .captures(filename)
.and_then(|c| build_date_from_ymd_capture(&c))
{ {
let year = captures.get(1)?.as_str().parse::<i32>().ok()?; return Some(captures);
let month = captures.get(2)?.as_str().parse::<u32>().ok()?;
let day = captures.get(3)?.as_str().parse::<u32>().ok()?;
let hour = captures.get(4)?.as_str().parse::<u32>().ok()?;
let min = captures.get(5)?.as_str().parse::<u32>().ok()?;
let sec = captures.get(6)?.as_str().parse::<u32>().ok()?;
return match Local.from_local_datetime(
&NaiveDate::from_ymd_opt(year, month, day)?.and_hms_opt(hour, min, sec)?,
) {
Single(dt) => Some(dt.fixed_offset()),
Ambiguous(early_dt, _) => Some(early_dt.fixed_offset()),
LocalResult::None => {
warn!("Weird local date: {:?}", filename);
return None;
}
};
} }
// 4. Timestamp format: xyz_1401638400.jpeg // 4. Timestamp format: 1401638400.jpeg
if let Some(captures) = regex::Regex::new(r"_(\d{10,})\.").ok()?.captures(filename) { if let Some(captures) = regex::Regex::new(r"(\d{10}|\d{13})\.")
.ok()?
.captures(filename)
{
let timestamp_str = captures.get(1)?.as_str(); let timestamp_str = captures.get(1)?.as_str();
// Millisecond timestamp (13 digits) // Millisecond timestamp (13 digits)
@@ -340,7 +319,7 @@ fn is_memories_match(
} }
let years_diff = (today.year() - file_date.year()).unsigned_abs(); let years_diff = (today.year() - file_date.year()).unsigned_abs();
if years_diff > years_back { if years_diff > years_back {
info!( warn!(
"File date is too far in the past: {:?} vs {:?}", "File date is too far in the past: {:?} vs {:?}",
file_date, today file_date, today
); );