playlistd/src/main.rs
2023-09-09 20:03:01 +01:00

75 lines
1.8 KiB
Rust

mod daemon;
mod listenbrainz;
mod models;
use navidrome::{
client::{builder::NavidromeBuilder, library::Library},
models::navidrome::NavidromeTrack,
};
use crate::daemon::{update_playlists_daemon, update_tracks_daemon};
use crate::listenbrainz::StatsRange;
use axum::extract::State;
use axum::routing::get;
use axum::Router;
use sqlx::postgres::PgPool;
use std::collections::HashMap;
use std::env;
use std::net::SocketAddr;
use std::sync::Arc;
use tokio::sync::RwLock;
#[derive(Clone)]
struct TrackState {
tracks: Arc<RwLock<HashMap<String, NavidromeTrack>>>,
}
#[tokio::main]
async fn main() -> Result<(), Box<dyn std::error::Error>> {
let database = PgPool::connect(&env::var("DATABASE_URL")?).await?;
sqlx::migrate!().run(&database).await?;
let media_client = NavidromeBuilder::new()
.base(env::var("NAVIDROME_BASE")?)
.token(env::var("NAVIDROME_TOKEN")?)
.build()?;
let mut tracks = Arc::new(RwLock::new(HashMap::new()));
let state = TrackState {
tracks: tracks.clone(),
};
tokio::spawn(async move {
update_playlists_daemon().await.unwrap();
});
tokio::spawn(async move {
update_tracks_daemon(&media_client, &mut tracks)
.await
.unwrap();
});
let app = Router::new().route("/", get(index)).with_state(database);
let addr = SocketAddr::from(([127, 0, 0, 1], 3000));
axum::Server::bind(&addr)
.serve(app.into_make_service())
.await?;
Ok(())
}
async fn index(State(pool): State<PgPool>) -> String {
let response = listenbrainz::recordings("jellywx", StatsRange::Week)
.await
.unwrap();
response
.recordings
.iter()
.map(|a| a.track_name.clone())
.collect::<Vec<String>>()
.join(", ")
}