Added configuration option for initial shuffle, repeat, volume
This commit is contained in:
committed by
Henrik Friedrichsen
parent
404ba65faf
commit
56a178dcfd
@@ -12,6 +12,14 @@ pub struct Config {
|
|||||||
pub keybindings: Option<HashMap<String, String>>,
|
pub keybindings: Option<HashMap<String, String>>,
|
||||||
pub theme: Option<ConfigTheme>,
|
pub theme: Option<ConfigTheme>,
|
||||||
pub use_nerdfont: Option<bool>,
|
pub use_nerdfont: Option<bool>,
|
||||||
|
pub saved_state: Option<SavedState>,
|
||||||
|
}
|
||||||
|
|
||||||
|
#[derive(Serialize, Deserialize, Debug, Default, Clone)]
|
||||||
|
pub struct SavedState {
|
||||||
|
pub volume: Option<u16>,
|
||||||
|
pub shuffle: Option<bool>,
|
||||||
|
pub repeat: Option<String>,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Serialize, Deserialize, Debug, Default, Clone)]
|
#[derive(Serialize, Deserialize, Debug, Default, Clone)]
|
||||||
|
|||||||
@@ -178,7 +178,7 @@ fn main() {
|
|||||||
|
|
||||||
let event_manager = EventManager::new(cursive.cb_sink().clone());
|
let event_manager = EventManager::new(cursive.cb_sink().clone());
|
||||||
|
|
||||||
let spotify = Arc::new(spotify::Spotify::new(event_manager.clone(), credentials));
|
let spotify = Arc::new(spotify::Spotify::new(event_manager.clone(), credentials, &cfg));
|
||||||
|
|
||||||
let queue = Arc::new(queue::Queue::new(spotify.clone()));
|
let queue = Arc::new(queue::Queue::new(spotify.clone()));
|
||||||
|
|
||||||
|
|||||||
@@ -23,13 +23,16 @@ pub struct Queue {
|
|||||||
|
|
||||||
impl Queue {
|
impl Queue {
|
||||||
pub fn new(spotify: Arc<Spotify>) -> Queue {
|
pub fn new(spotify: Arc<Spotify>) -> Queue {
|
||||||
Queue {
|
let q = Queue {
|
||||||
queue: Arc::new(RwLock::new(Vec::new())),
|
queue: Arc::new(RwLock::new(Vec::new())),
|
||||||
|
spotify,
|
||||||
current_track: RwLock::new(None),
|
current_track: RwLock::new(None),
|
||||||
repeat: RwLock::new(RepeatSetting::None),
|
repeat: RwLock::new(RepeatSetting::None),
|
||||||
random_order: RwLock::new(None),
|
random_order: RwLock::new(None),
|
||||||
spotify,
|
};
|
||||||
}
|
q.set_repeat(q.spotify.repeat);
|
||||||
|
q.set_shuffle(q.spotify.shuffle);
|
||||||
|
q
|
||||||
}
|
}
|
||||||
|
|
||||||
pub fn next_index(&self) -> Option<usize> {
|
pub fn next_index(&self) -> Option<usize> {
|
||||||
|
|||||||
@@ -46,6 +46,7 @@ use artist::Artist;
|
|||||||
use config;
|
use config;
|
||||||
use events::{Event, EventManager};
|
use events::{Event, EventManager};
|
||||||
use track::Track;
|
use track::Track;
|
||||||
|
use queue;
|
||||||
|
|
||||||
pub const VOLUME_PERCENT: u16 = ((u16::max_value() as f64) * 1.0 / 100.0) as u16;
|
pub const VOLUME_PERCENT: u16 = ((u16::max_value() as f64) * 1.0 / 100.0) as u16;
|
||||||
|
|
||||||
@@ -75,7 +76,9 @@ pub struct Spotify {
|
|||||||
token_issued: RwLock<Option<SystemTime>>,
|
token_issued: RwLock<Option<SystemTime>>,
|
||||||
channel: mpsc::UnboundedSender<WorkerCommand>,
|
channel: mpsc::UnboundedSender<WorkerCommand>,
|
||||||
user: String,
|
user: String,
|
||||||
volume: AtomicU16,
|
pub volume: AtomicU16,
|
||||||
|
pub repeat: queue::RepeatSetting,
|
||||||
|
pub shuffle: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
struct Worker {
|
struct Worker {
|
||||||
@@ -211,14 +214,38 @@ impl futures::Future for Worker {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl Spotify {
|
impl Spotify {
|
||||||
pub fn new(events: EventManager, credentials: Credentials) -> Spotify {
|
pub fn new(events: EventManager, credentials: Credentials, cfg: &config::Config) -> Spotify {
|
||||||
let player_config = PlayerConfig {
|
let player_config = PlayerConfig {
|
||||||
bitrate: Bitrate::Bitrate320,
|
bitrate: Bitrate::Bitrate320,
|
||||||
normalisation: false,
|
normalisation: false,
|
||||||
normalisation_pregain: 0.0,
|
normalisation_pregain: 0.0,
|
||||||
};
|
};
|
||||||
let (user_tx, user_rx) = oneshot::channel();
|
let (user_tx, user_rx) = oneshot::channel();
|
||||||
let volume = 0xFFFF;
|
let volume = match &cfg.saved_state {
|
||||||
|
Some(state) => match state.volume {
|
||||||
|
Some(vol) => vol,
|
||||||
|
None => 0xFFFF as u16,
|
||||||
|
},
|
||||||
|
None => 0xFFFF as u16,
|
||||||
|
};
|
||||||
|
let repeat = match &cfg.saved_state {
|
||||||
|
Some(state) => match &state.repeat {
|
||||||
|
Some(s) => match s.as_str() {
|
||||||
|
"track" => queue::RepeatSetting::RepeatTrack,
|
||||||
|
"playlist" => queue::RepeatSetting::RepeatPlaylist,
|
||||||
|
_ => queue::RepeatSetting::None,
|
||||||
|
}
|
||||||
|
_ => queue::RepeatSetting::None,
|
||||||
|
},
|
||||||
|
_ => queue::RepeatSetting::None,
|
||||||
|
};
|
||||||
|
let shuffle = match &cfg.saved_state {
|
||||||
|
Some(state) => match &state.shuffle {
|
||||||
|
Some(true) => true,
|
||||||
|
_ => false,
|
||||||
|
},
|
||||||
|
None => false,
|
||||||
|
};
|
||||||
|
|
||||||
let (tx, rx) = mpsc::unbounded();
|
let (tx, rx) = mpsc::unbounded();
|
||||||
{
|
{
|
||||||
@@ -236,6 +263,8 @@ impl Spotify {
|
|||||||
channel: tx,
|
channel: tx,
|
||||||
user: user_rx.wait().expect("error retrieving userid from worker"),
|
user: user_rx.wait().expect("error retrieving userid from worker"),
|
||||||
volume: AtomicU16::new(volume),
|
volume: AtomicU16::new(volume),
|
||||||
|
repeat: repeat,
|
||||||
|
shuffle: shuffle,
|
||||||
};
|
};
|
||||||
|
|
||||||
// acquire token for web api usage
|
// acquire token for web api usage
|
||||||
|
|||||||
Reference in New Issue
Block a user