From 92d1978340e41c672857b918bc6a5b729340524b Mon Sep 17 00:00:00 2001 From: Henrik Friedrichsen Date: Mon, 22 Feb 2021 22:08:00 +0100 Subject: [PATCH] Save track queue when closing and restore at start --- src/commands.rs | 5 +++++ src/config.rs | 9 +++++++-- src/playable.rs | 3 ++- src/queue.rs | 3 ++- 4 files changed, 16 insertions(+), 4 deletions(-) diff --git a/src/commands.rs b/src/commands.rs index 7a7a1fc..cf2e890 100644 --- a/src/commands.rs +++ b/src/commands.rs @@ -106,6 +106,11 @@ impl CommandManager { match cmd { Command::Noop => Ok(None), Command::Quit => { + let queue = self.queue.queue.read().expect("can't readlock queue"); + self.config.with_state_mut(move |mut s| { + s.queue = queue.clone(); + }); + self.config.save_state(); s.quit(); Ok(None) } diff --git a/src/config.rs b/src/config.rs index 2863d2d..87a72b2 100644 --- a/src/config.rs +++ b/src/config.rs @@ -6,6 +6,7 @@ use std::{fs, process}; use cursive::theme::Theme; use platform_dirs::AppDirs; +use crate::playable::Playable; use crate::queue; pub const CLIENT_ID: &str = "d420a117a32841c2b3474932e49fb54b"; @@ -54,6 +55,7 @@ pub struct UserState { pub volume: u16, pub shuffle: bool, pub repeat: queue::RepeatSetting, + pub queue: Vec, } impl Default for UserState { @@ -62,6 +64,7 @@ impl Default for UserState { volume: u16::max_value(), shuffle: false, repeat: queue::RepeatSetting::None, + queue: Vec::new(), } } } @@ -84,7 +87,7 @@ impl Config { let userstate = { let path = config_path("userstate.toml"); - load_or_generate_default(path, |_| Ok(UserState::default()), false) + load_or_generate_default(path, |_| Ok(UserState::default()), true) .expect("could not load user state") }; @@ -108,8 +111,11 @@ impl Config { { let state_guard = self.state.write().expect("can't writelock user state"); cb(state_guard); + } + pub fn save_state(&self) { let path = config_path("userstate.toml"); + debug!("saving user state to {}", path.display()); if let Err(e) = write_content_helper(path, self.state().clone()) { error!("Could not save user state: {}", e); } @@ -146,7 +152,6 @@ fn proj_dirs() -> AppDirs { pub fn config_path(file: &str) -> PathBuf { let proj_dirs = proj_dirs(); let cfg_dir = &proj_dirs.config_dir; - trace!("{:?}", cfg_dir); if cfg_dir.exists() && !cfg_dir.is_dir() { fs::remove_file(cfg_dir).expect("unable to remove old config file"); } diff --git a/src/playable.rs b/src/playable.rs index e1fe69a..4dae559 100644 --- a/src/playable.rs +++ b/src/playable.rs @@ -8,7 +8,8 @@ use crate::traits::{ListItem, ViewExt}; use std::fmt; use std::sync::Arc; -#[derive(Clone, Debug)] +#[derive(Clone, Debug, Deserialize, Serialize)] +#[serde(tag = "type")] pub enum Playable { Track(Track), Episode(Episode), diff --git a/src/queue.rs b/src/queue.rs index 1845c8e..0973ab1 100644 --- a/src/queue.rs +++ b/src/queue.rs @@ -28,8 +28,9 @@ pub struct Queue { impl Queue { pub fn new(spotify: Arc, cfg: Arc) -> Queue { + let queue = cfg.state().queue.clone(); Queue { - queue: Arc::new(RwLock::new(Vec::new())), + queue: Arc::new(RwLock::new(queue)), spotify, current_track: RwLock::new(None), random_order: RwLock::new(None),