Save track queue when closing and restore at start

This commit is contained in:
Henrik Friedrichsen
2021-02-22 22:08:00 +01:00
parent a880ffd1f6
commit 92d1978340
4 changed files with 16 additions and 4 deletions

View File

@@ -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)
}

View File

@@ -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<Playable>,
}
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");
}

View File

@@ -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),

View File

@@ -28,8 +28,9 @@ pub struct Queue {
impl Queue {
pub fn new(spotify: Arc<Spotify>, cfg: Arc<Config>) -> 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),