From 2b8c13014b9d423987cbb88586d66636aefa3683 Mon Sep 17 00:00:00 2001 From: Gabriel Simmer Date: Fri, 22 Sep 2023 13:10:44 +0100 Subject: [PATCH] Properly format RSS pubdates --- Cargo.lock | 43 +++++++++++++++++++++++++++++++++++++++---- Cargo.toml | 3 ++- src/main.rs | 16 ++++++++++++---- 3 files changed, 53 insertions(+), 9 deletions(-) diff --git a/Cargo.lock b/Cargo.lock index 4ed68a9..2d35ff9 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -611,6 +611,12 @@ dependencies = [ "zeroize", ] +[[package]] +name = "deranged" +version = "0.3.8" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "f2696e8a945f658fd14dc3b87242e6b80cd0f36ff04ea560fa39082368847946" + [[package]] name = "derive_builder" version = "0.12.0" @@ -1863,6 +1869,7 @@ dependencies = [ "serde_dhall", "sha2", "sqlx", + "time", "tokio", "tower", "tower-http", @@ -2145,18 +2152,18 @@ dependencies = [ [[package]] name = "serde" -version = "1.0.183" +version = "1.0.188" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "32ac8da02677876d532745a130fc9d8e6edfa81a269b107c5b00829b91d8eb3c" +checksum = "cf9e0fcba69a370eed61bcf2b728575f726b50b55cba78064753d708ddc7549e" dependencies = [ "serde_derive", ] [[package]] name = "serde_derive" -version = "1.0.183" +version = "1.0.188" source = "registry+https://github.com/rust-lang/crates.io-index" -checksum = "aafe972d60b0b9bee71a91b92fee2d4fb3c9d7e8f6b179aa99f27203d99a4816" +checksum = "4eca7ac642d82aa35b60049a6eccb4be6be75e599bd2e9adb5f875a737654af2" dependencies = [ "proc-macro2", "quote", @@ -2641,6 +2648,34 @@ dependencies = [ "lazy_static 1.4.0", ] +[[package]] +name = "time" +version = "0.3.28" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "17f6bb557fd245c28e6411aa56b6403c689ad95061f50e4be16c274e70a17e48" +dependencies = [ + "deranged", + "itoa", + "serde", + "time-core", + "time-macros", +] + +[[package]] +name = "time-core" +version = "0.1.1" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "7300fbefb4dadc1af235a9cef3737cea692a9d97e1b9cbcd4ebdae6f8868e6fb" + +[[package]] +name = "time-macros" +version = "0.2.14" +source = "registry+https://github.com/rust-lang/crates.io-index" +checksum = "1a942f44339478ef67935ab2bbaec2fb0322496cf3cbe84b261e06ac3814c572" +dependencies = [ + "time-core", +] + [[package]] name = "tinyvec" version = "1.6.0" diff --git a/Cargo.toml b/Cargo.toml index c7e5010..53d124c 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -24,4 +24,5 @@ clap = { version = "4.0", features = ["derive"] } serde_dhall = "0.12.1" frontmatter = "0.4.0" file-format = "0.18.0" -rss = "2.0.6" \ No newline at end of file +rss = "2.0.6" +time = { version = "0.3.28", features = ["parsing", "formatting", "macros"] } \ No newline at end of file diff --git a/src/main.rs b/src/main.rs index 8905b43..fb5aa9f 100644 --- a/src/main.rs +++ b/src/main.rs @@ -20,6 +20,7 @@ use orgize::Org; use serde::Deserialize; use sqlx::sqlite::{SqliteConnectOptions, SqliteJournalMode, SqlitePoolOptions}; use sqlx::{FromRow, Pool, Sqlite}; +use time::format_description::well_known::Rfc2822; use std::collections::HashMap; use std::fs::{self, File}; use std::io::prelude::*; @@ -28,6 +29,8 @@ use std::time::{SystemTime, UNIX_EPOCH}; use tokio::sync::Mutex; use tower_http::services::ServeDir; use rss::ChannelBuilder; +use time::{self, Date, format_description}; +use time::macros::time as t; lazy_static! { static ref CACHE: Mutex> = Mutex::new(HashMap::new()); @@ -156,18 +159,23 @@ async fn rss() -> Result { .find(|&x| x.contains("title:")) .unwrap_or(&"") .split(":") - .collect::>()[1]; - let date = date.trim(); - dbg!(&date); + .collect::>()[1].trim(); + let date = format!("{} 00:00:00 +00:00:00", date.trim()); + let format = format_description::parse("[year]-[month]-[day] [hour]:[minute]:[second] [offset_hour sign:mandatory]:[offset_minute]:[offset_second]").unwrap(); + let pub_date = match time::OffsetDateTime::parse(&date, &format).unwrap().format(&Rfc2822) { + Ok(r) => r, + Err(e) => { dbg!(e.to_string()); "".to_owned() }, + }; let item = rss::ItemBuilder::default() .title(Some(title.to_owned())) .link(Some(format!("https://gabrielsimmer.com/blog/{}", fname))) - .pub_date(Some(date.to_owned())) + .pub_date(Some(pub_date)) .build(); posts.push(item); } } + let channel = ChannelBuilder::default() .title("Gabriel Simmer's Blog".to_owned()) .link("https://gabrielsimmer.com/blog".to_owned())