feature/memories #35
@@ -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,81 +111,60 @@ 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>> {
|
||||||
|
let build_date_from_ymd_capture =
|
||||||
|
|captures: ®ex::Captures| -> Option<DateTime<FixedOffset>> {
|
||||||
|
let year = captures.get(1)?.as_str().parse::<i32>().ok()?;
|
||||||
|
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()?;
|
||||||
|
|
||||||
|
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);
|
||||||
|
None
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
// 1. Screenshot format: Screenshot_2014-06-01-20-44-50.png
|
// 1. Screenshot format: Screenshot_2014-06-01-20-44-50.png
|
||||||
if let Some(captures) =
|
if let Some(captures) =
|
||||||
regex::Regex::new(r"Screenshot_(\d{4})-(\d{2})-(\d{2})-(\d{2})-(\d{2})-(\d{2})")
|
regex::Regex::new(r"Screenshot_(\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;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
}
|
||||||
|
|
||||||
// 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
|
||||||
);
|
);
|
||||||
|
|||||||
Reference in New Issue
Block a user