···2020jacquard-identity = { version = "0.9.2", features = ["cache"] }
2121jacquard-lexicon = "0.9.2"
2222metrics = "0.24.3"
2323-metrics-exporter-prometheus = "0.18.0"
2323+metrics-exporter-prometheus = { version = "0.18.0", default-features = false, features = ["http-listener"] }
2424r2d2 = "0.8"
2525reqwest = "0.12.24"
2626serde = { version = "1.0.228", features = ["derive"] }
+5
src/ingest/scrobbles.rs
···11use crate::mbz::{FindMbzData, try_find_mbz_data};
22use chrono::prelude::*;
33+use chrono::{DurationRound, TimeDelta};
34use duckdb::{Connection, DuckdbConnectionManager, OptionalExt, params};
45use jacquard::types::datetime::Datetime;
56use jacquard_api::app_rocksky::scrobble::Scrobble as RockskyScrobble;
···123124 track: &str,
124125 created: DateTime<Utc>,
125126) -> duckdb::Result<Option<String>> {
127127+ // try to round the timestamp down to just seconds - if it fails, just use the og timestamp.
128128+ let created = created
129129+ .duration_trunc(TimeDelta::seconds(1))
130130+ .unwrap_or(created);
126131 let mut stmt = conn.prepare_cached(
127132 "SELECT rkey FROM scrobbles WHERE did = $1 AND track_name = $2 AND created_at = $3",
128133 )?;