WIP: rss
Some checks are pending
ci/woodpecker/push/publish Pipeline is pending

This commit is contained in:
Mylloon 2023-04-26 12:50:08 +02:00
parent c1f724e8bc
commit 94387f02bf
Signed by: Anri
GPG key ID: A82D63DFF8D1317F
4 changed files with 136 additions and 1 deletions

73
Cargo.lock generated
View file

@ -355,6 +355,19 @@ version = "0.2.6"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "2ce4f10ea3abcd6617873bae9f91d1c5332b4a778bd9ce34d0cd517474c1de82" checksum = "2ce4f10ea3abcd6617873bae9f91d1c5332b4a778bd9ce34d0cd517474c1de82"
[[package]]
name = "atom_syndication"
version = "0.12.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ca96cb38e3d8236f1573a84bbc55e130bd1ae07df770e36d0cf221ea7a50e36c"
dependencies = [
"chrono",
"derive_builder",
"diligent-date-parser",
"never",
"quick-xml",
]
[[package]] [[package]]
name = "autocfg" name = "autocfg"
version = "1.1.0" version = "1.1.0"
@ -764,6 +777,37 @@ dependencies = [
"syn 1.0.109", "syn 1.0.109",
] ]
[[package]]
name = "derive_builder"
version = "0.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "8d67778784b508018359cbc8696edb3db78160bab2c2a28ba7f56ef6932997f8"
dependencies = [
"derive_builder_macro",
]
[[package]]
name = "derive_builder_core"
version = "0.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c11bdc11a0c47bc7d37d582b5285da6849c96681023680b906673c5707af7b0f"
dependencies = [
"darling",
"proc-macro2",
"quote",
"syn 1.0.109",
]
[[package]]
name = "derive_builder_macro"
version = "0.12.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "ebcda35c7a396850a55ffeac740804b40ffec779b98fffbb1738f4033f0ee79e"
dependencies = [
"derive_builder_core",
"syn 1.0.109",
]
[[package]] [[package]]
name = "derive_more" name = "derive_more"
version = "0.99.17" version = "0.99.17"
@ -793,6 +837,15 @@ dependencies = [
"crypto-common", "crypto-common",
] ]
[[package]]
name = "diligent-date-parser"
version = "0.1.4"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "f6cf7fe294274a222363f84bcb63cdea762979a0443b4cf1f4f8fd17c86b1182"
dependencies = [
"chrono",
]
[[package]] [[package]]
name = "dirs" name = "dirs"
version = "4.0.0" version = "4.0.0"
@ -863,6 +916,7 @@ dependencies = [
"minify-js 0.5.6", "minify-js 0.5.6",
"ramhorns", "ramhorns",
"reqwest", "reqwest",
"rss",
"serde", "serde",
"serde_yaml", "serde_yaml",
"toml", "toml",
@ -1478,6 +1532,12 @@ dependencies = [
"tempfile", "tempfile",
] ]
[[package]]
name = "never"
version = "0.1.0"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "c96aba5aa877601bb3f6dd6a63a969e1f82e60646e81e71b14496995e9853c91"
[[package]] [[package]]
name = "nom" name = "nom"
version = "7.1.3" version = "7.1.3"
@ -1736,6 +1796,7 @@ version = "0.28.2"
source = "registry+https://github.com/rust-lang/crates.io-index" source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "0ce5e73202a820a31f8a0ee32ada5e21029c81fd9e3ebf668a40832e4219d9d1" checksum = "0ce5e73202a820a31f8a0ee32ada5e21029c81fd9e3ebf668a40832e4219d9d1"
dependencies = [ dependencies = [
"encoding_rs",
"memchr", "memchr",
] ]
@ -1894,6 +1955,18 @@ dependencies = [
"winreg", "winreg",
] ]
[[package]]
name = "rss"
version = "2.0.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "aa1ec965a5f5ec71e16106b35df21861c4014ace848c6b75720816925552936d"
dependencies = [
"atom_syndication",
"derive_builder",
"never",
"quick-xml",
]
[[package]] [[package]]
name = "rustc-hash" name = "rustc-hash"
version = "1.1.0" version = "1.1.0"

View file

@ -23,3 +23,4 @@ glob = "0.3.1"
comrak = "0.18" comrak = "0.18"
reqwest = { version = "0.11", features = ["json"] } reqwest = { version = "0.11", features = ["json"] }
chrono = "0.4.24" chrono = "0.4.24"
rss = "2.0.3"

View file

@ -41,6 +41,7 @@ async fn main() -> Result<()> {
.service(portfolio::page) .service(portfolio::page)
.service(contrib::page) .service(contrib::page)
.service(blog::index) .service(blog::index)
.service(blog::rss)
.service(blog::page) .service(blog::page)
.service(web3::page) .service(web3::page)
.service(gaming::page) .service(gaming::page)

View file

@ -1,4 +1,5 @@
use actix_web::{get, web, HttpResponse, Responder}; use ::rss::{Category, Channel, Image};
use actix_web::{dev::ConnectionInfo, get, web, HttpRequest, HttpResponse, Responder};
use cached::proc_macro::once; use cached::proc_macro::once;
use chrono::{DateTime, Datelike, Utc}; use chrono::{DateTime, Datelike, Utc};
use comrak::{parse_document, Arena}; use comrak::{parse_document, Arena};
@ -152,3 +153,62 @@ fn get_post(post: &mut Option<File>, filename: String) -> Infos {
page_kw: Some(["blog", "blogging", "write", "writing"].join(", ")), page_kw: Some(["blog", "blogging", "write", "writing"].join(", ")),
} }
} }
#[get("/blog/rss")]
pub async fn rss(req: HttpRequest, config: web::Data<Config>) -> impl Responder {
HttpResponse::Ok().body(build_rss(
config.get_ref().to_owned(),
req.connection_info().to_owned(),
))
}
//#[once(time = 10800)] // 3h
fn build_rss(config: Config, info: ConnectionInfo) -> String {
let mut posts = get_posts("data/blog");
// Sort from newest to oldest
posts.sort_by_cached_key(|p| (p.date.year, p.date.month, p.date.day));
posts.reverse();
// Only the 20 newest
let max = 20;
if posts.len() > max {
posts.drain(max..);
}
let link_to_site = format!("{}://{}", info.scheme(), info.host());
let channel = Channel {
title: "Blog d'Anri".into(),
link: link_to_site.to_owned(),
description: "Un fil qui parle d'infos".into(),
language: Some("fr".into()),
managing_editor: config.fc.mail.to_owned(),
webmaster: config.fc.mail,
pub_date: Some(chrono::Utc::now().to_rfc2822().replace("+0000", "GMT")),
categories: ["blog", "blogging", "write", "writing"]
.iter()
.map(|&c| Category {
name: c.into(),
..Category::default()
})
.collect(),
generator: Some("ewp with rss crate".into()),
docs: Some("https://www.rssboard.org/rss-specification".into()),
image: Some(Image {
url: format!(
"{}://{}/icons/favicon-32x32.png",
info.scheme(),
info.host()
),
title: "Favicon".into(),
link: link_to_site,
..Image::default()
}),
items: vec![],
..Channel::default()
};
std::str::from_utf8(&channel.write_to(Vec::new()).unwrap())
.unwrap()
.into()
}