diff --git a/.gitignore b/.gitignore index ea8c4bf..c1cdd55 100644 --- a/.gitignore +++ b/.gitignore @@ -1 +1,2 @@ /target +Rocket.toml diff --git a/Rocket.toml.example b/Rocket.toml.example new file mode 100644 index 0000000..5264447 --- /dev/null +++ b/Rocket.toml.example @@ -0,0 +1,4 @@ +[default] +address = "0.0.0.0" +port = 7062 +url = "https://my.domain.tld/podbringer" diff --git a/src/lib.rs b/src/lib.rs index 6229007..22573d0 100644 --- a/src/lib.rs +++ b/src/lib.rs @@ -11,8 +11,10 @@ use std::process::Stdio; use chrono::{DateTime, NaiveDateTime, Utc}; use reqwest::Url; +use rocket::fairing::AdHoc; use rocket::response::stream::ReaderStream; -use rocket::{get, routes, Build, Responder, Rocket}; +use rocket::serde::{Deserialize, Serialize}; +use rocket::{get, routes, Build, Responder, Rocket, State}; use rss::extension::itunes::ITunesItemExtensionBuilder; use rss::{ CategoryBuilder, ChannelBuilder, EnclosureBuilder, GuidBuilder, ImageBuilder, ItemBuilder, @@ -21,6 +23,14 @@ use tokio::process::{ChildStdout, Command}; pub(crate) mod mixcloud; +/// The extra application specific configuration. +#[derive(Debug, Deserialize, Serialize)] +#[serde(crate = "rocket::serde")] +pub(crate) struct Config { + #[serde(default)] + url: String, +} + /// A Rocket responder wrapper type for RSS feeds. #[derive(Responder)] #[response(content_type = "application/xml")] @@ -28,7 +38,7 @@ struct RssFeed(String); /// Handler for retrieving the RSS feed of an Mixcloud user. #[get("/")] -async fn feed(username: &str) -> Option { +async fn feed(username: &str, config: &State) -> Option { let user = mixcloud::get_user(username).await?; let cloudcasts = mixcloud::get_cloudcasts(username).await?; let mut last_build = DateTime::::from_utc(NaiveDateTime::from_timestamp(0, 0), Utc); @@ -42,7 +52,8 @@ async fn feed(username: &str) -> Option { .into_iter() .map(|cloudcast| { let slug = cloudcast.slug; - let mut url = Url::parse("http://localhost:8000/download").unwrap(); + let mut url = Url::parse(&config.url).unwrap(); + url.set_path(&format!("{}/download", &url.path()[1..])); url.query_pairs_mut().append_pair("url", &cloudcast.url); let description = format!("Taken from Mixcloud: <{}>", cloudcast.url); let keywords = cloudcast @@ -142,4 +153,5 @@ pub fn setup() -> Rocket { rocket::build() .mount("/mixcloud", routes![feed]) .mount("/download", routes![download]) + .attach(AdHoc::config::()) }