despot/src/main.rs
2024-11-20 20:01:31 +01:00

108 lines
3.2 KiB
Rust

use std::{sync::Arc, thread};
use api::{SpotifyContext, SpotifyContextRef};
use auth::get_token;
use clap::Parser;
use cli::Args;
use cushy::{
value::Dynamic, widget::MakeWidget, window::MakeWindow, Application, Open, PendingApp, Run,
TokioRuntime,
};
use librespot_connect::{
spirc::{Spirc, SpircLoadCommand},
state::ConnectStateConfig,
};
use librespot_core::{authentication::Credentials, Session, SessionConfig};
use librespot_playback::{
audio_backend,
config::{AudioFormat, PlayerConfig},
mixer::{softmixer::SoftMixer, Mixer, MixerConfig, NoOpVolume},
player::{Player, PlayerEvent},
};
use player::{new_dynamic_player, DynamicPlayer, DynamicPlayerInner};
use widgets::{
library::playlist::playlists_widget, pages::liked::LikedSongsPage, playback::bar::bar,
ActivePage,
};
mod api;
mod auth;
mod cli;
mod nodebug;
mod player;
mod rt;
mod theme;
mod vibrancy;
mod widgets;
fn main() -> cushy::Result {
let args = Args::parse();
let app = PendingApp::new(TokioRuntime::default());
let token = get_token().unwrap();
let session_config = SessionConfig::default();
let player_config = PlayerConfig::default();
let audio_format = AudioFormat::default();
let credentials = Credentials::with_access_token(&token.access_token);
let connect_config = ConnectStateConfig::default();
let backend = audio_backend::find(None).unwrap();
let session;
{
let guard = app.cushy().enter_runtime();
session = Session::new(session_config, None);
dbg!(session.user_data());
let player = Player::new(
player_config,
session.clone(),
Box::new(NoOpVolume),
move || backend(None, audio_format),
);
let context = SpotifyContextRef::new(SpotifyContext::new(session.clone(), token));
let mut app = app.as_app();
tokio::spawn(async move {
let (_spirc, spirc_task) = Spirc::new(
connect_config,
session.clone(),
credentials,
player.clone(),
Arc::new(SoftMixer::open(MixerConfig::default())),
)
.await
.unwrap();
let dynplayer = new_dynamic_player(player);
// this cannot happen in `{}` inside join for some reason
let dynplayer2 = dynplayer.clone();
tokio::join!(spirc_task, dynplayer2.run(), async move {
let user = context.current_user().await.unwrap();
dbg!(&user);
// let userid = user.id;
let playlists = context.current_user_playlists(None, None).await.unwrap();
let selected_page = Dynamic::new(ActivePage::default());
playlists_widget(playlists.items, selected_page)
.and(LikedSongsPage::new(context.clone()).into_widget())
.into_columns()
.expand()
.and(bar(dynplayer))
.into_rows()
.expand()
.make_window()
.open(&mut app)
.unwrap();
});
});
drop(guard);
}
app.run()
}