single file...almost
This commit is contained in:
25
src/main.rs
25
src/main.rs
@@ -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());
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
19
src/state.rs
19
src/state.rs
@@ -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();
|
|
||||||
}
|
|
||||||
}
|
|
@@ -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)
|
|
||||||
}
|
|
Reference in New Issue
Block a user