single file...almost
All checks were successful
CI/CD Pipeline / test (push) Successful in 2m7s
CI/CD Pipeline / deploy (push) Successful in 2m20s

This commit is contained in:
Philipp Hofer
2025-10-15 15:13:29 +02:00
parent 2f3abdf546
commit f941eac386
3 changed files with 17 additions and 41 deletions

View File

@@ -1,18 +1,27 @@
mod state; use axum::{extract::State, http::HeaderMap, response::IntoResponse, routing::get, Router};
mod streamer;
use axum::{routing::get, Router};
use chrono::Utc; use chrono::Utc;
use state::AppState; use player::Feed;
use reqwest::header;
use std::sync::Arc; use std::sync::Arc;
use tokio::sync::RwLock;
use tokio_cron_scheduler::{Job, JobScheduler}; use tokio_cron_scheduler::{Job, JobScheduler};
pub async fn stream_handler(State(state): State<Arc<RwLock<Feed>>>) -> impl IntoResponse {
state.write().await.fetch().await.unwrap();
let content = state.read().await.to_rss();
let mut headers = HeaderMap::new();
headers.insert(header::CONTENT_TYPE, "application/rss+xml".parse().unwrap());
(headers, content)
}
#[tokio::main] #[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> { async fn main() -> Result<(), Box<dyn std::error::Error>> {
let state = Arc::new(AppState::new().await.unwrap()); let state = Arc::new(RwLock::new(Feed::new().await.unwrap()));
let app = Router::new() let app = Router::new()
.route("/", get(streamer::stream_handler)) .route("/", get(stream_handler))
.with_state(state.clone()); .with_state(state.clone());
let scheduler = JobScheduler::new().await.unwrap(); let scheduler = JobScheduler::new().await.unwrap();
@@ -21,7 +30,7 @@ async fn main() -> Result<(), Box<dyn std::error::Error>> {
Job::new_async("0 0 */3 * * *", move |_uuid, _locked| { Job::new_async("0 0 */3 * * *", move |_uuid, _locked| {
let state_for_task = state.clone(); let state_for_task = state.clone();
Box::pin(async move { Box::pin(async move {
state_for_task.update().await; state_for_task.write().await.fetch().await.unwrap();
println!("Task executed at: {}", Utc::now()); println!("Task executed at: {}", Utc::now());
}) })
}) })

View File

@@ -1,19 +0,0 @@
use player::Feed;
use std::sync::Arc;
use tokio::sync::RwLock;
pub struct AppState {
pub feed: RwLock<Feed>,
}
impl AppState {
pub async fn new() -> Result<Self, Box<dyn std::error::Error>> {
Ok(Self {
feed: RwLock::new(Feed::new().await?),
})
}
pub async fn update(self: Arc<Self>) {
self.feed.write().await.fetch().await.unwrap();
}
}

View File

@@ -1,14 +0,0 @@
use crate::state::AppState;
use axum::{extract::State, http::HeaderMap, response::IntoResponse};
use reqwest::header;
use std::sync::Arc;
pub async fn stream_handler(State(state): State<Arc<AppState>>) -> impl IntoResponse {
state.clone().update().await;
let content = state.feed.read().await.to_rss();
let mut headers = HeaderMap::new();
headers.insert(header::CONTENT_TYPE, "application/rss+xml".parse().unwrap());
(headers, content)
}