diff --git a/Cargo.lock b/Cargo.lock index d633b4b..24feb0f 100644 --- a/Cargo.lock +++ b/Cargo.lock @@ -1637,7 +1637,7 @@ dependencies = [ [[package]] name = "ncspot" -version = "0.1.2" +version = "0.1.3" dependencies = [ "chrono 0.4.11 (registry+https://github.com/rust-lang/crates.io-index)", "clap 2.33.0 (registry+https://github.com/rust-lang/crates.io-index)", diff --git a/Cargo.toml b/Cargo.toml index 8977e25..be61965 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -2,12 +2,13 @@ name = "ncspot" description = "ncurses Spotify client written in Rust using librespot, inspired by ncmpc and the likes." exclude = ["screenshots/**"] -version = "0.1.2" +version = "0.1.3" authors = ["Henrik Friedrichsen "] repository = "https://github.com/hrkfdn/ncspot" keywords = ["spotify", "ncurses", "librespot"] license = "BSD-2-Clause" readme = "README.md" +edition = "2018" [badges] travis-ci = { repository = "hrkfdn/ncspot", branch = "master" } diff --git a/src/album.rs b/src/album.rs index 916a506..a55d705 100644 --- a/src/album.rs +++ b/src/album.rs @@ -4,13 +4,13 @@ use std::sync::Arc; use chrono::{DateTime, Utc}; use rspotify::spotify::model::album::{FullAlbum, SavedAlbum, SimplifiedAlbum}; -use artist::Artist; -use library::Library; -use queue::Queue; -use spotify::Spotify; -use track::Track; -use traits::{IntoBoxedViewExt, ListItem, ViewExt}; -use ui::album::AlbumView; +use crate::artist::Artist; +use crate::library::Library; +use crate::queue::Queue; +use crate::spotify::Spotify; +use crate::track::Track; +use crate::traits::{IntoBoxedViewExt, ListItem, ViewExt}; +use crate::ui::album::AlbumView; #[derive(Clone, Deserialize, Serialize)] pub struct Album { diff --git a/src/artist.rs b/src/artist.rs index 1ec2115..26c24d4 100644 --- a/src/artist.rs +++ b/src/artist.rs @@ -3,13 +3,13 @@ use std::sync::Arc; use rspotify::spotify::model::artist::{FullArtist, SimplifiedArtist}; -use album::Album; -use library::Library; -use queue::Queue; -use spotify::Spotify; -use track::Track; -use traits::{IntoBoxedViewExt, ListItem, ViewExt}; -use ui::artist::ArtistView; +use crate::album::Album; +use crate::library::Library; +use crate::queue::Queue; +use crate::spotify::Spotify; +use crate::track::Track; +use crate::traits::{IntoBoxedViewExt, ListItem, ViewExt}; +use crate::ui::artist::ArtistView; #[derive(Clone, Deserialize, Serialize)] pub struct Artist { diff --git a/src/command.rs b/src/command.rs index b862092..0e82604 100644 --- a/src/command.rs +++ b/src/command.rs @@ -1,4 +1,4 @@ -use queue::RepeatSetting; +use crate::queue::RepeatSetting; use std::collections::HashMap; use std::fmt; use std::iter::FromIterator; @@ -252,7 +252,7 @@ pub fn parse(input: &str) -> Option { Some(Command::Repeat(mode)) } - "seek" => args.get(0).and_then(|arg| match arg.chars().nth(0) { + "seek" => args.get(0).and_then(|arg| match arg.chars().next() { Some(x) if x == '-' || x == '+' => String::from_iter(arg.chars().skip(1)) .parse::() .ok() diff --git a/src/commands.rs b/src/commands.rs index 745b1a2..6e42b8a 100644 --- a/src/commands.rs +++ b/src/commands.rs @@ -2,16 +2,16 @@ use std::collections::HashMap; use std::sync::Arc; use std::time::Duration; -use command::{parse, Command, GotoMode, MoveMode, SeekDirection, ShiftMode, TargetMode}; +use crate::command::{parse, Command, GotoMode, MoveMode, SeekDirection, ShiftMode, TargetMode}; +use crate::library::Library; +use crate::queue::{Queue, RepeatSetting}; +use crate::spotify::{Spotify, VOLUME_PERCENT}; +use crate::traits::ViewExt; +use crate::ui::layout::Layout; use cursive::event::{Event, Key}; use cursive::traits::View; use cursive::views::ViewRef; use cursive::Cursive; -use library::Library; -use queue::{Queue, RepeatSetting}; -use spotify::{Spotify, VOLUME_PERCENT}; -use traits::ViewExt; -use ui::layout::Layout; pub enum CommandResult { Consumed(Option), diff --git a/src/events.rs b/src/events.rs index 929da95..0760b84 100644 --- a/src/events.rs +++ b/src/events.rs @@ -1,7 +1,7 @@ use crossbeam_channel::{unbounded, Receiver, Sender, TryIter}; use cursive::{CbSink, Cursive}; -use spotify::PlayerEvent; +use crate::spotify::PlayerEvent; pub enum Event { Player(PlayerEvent), diff --git a/src/library.rs b/src/library.rs index 7943c7f..a59c97b 100644 --- a/src/library.rs +++ b/src/library.rs @@ -9,13 +9,13 @@ use rspotify::spotify::model::playlist::SimplifiedPlaylist; use serde::de::DeserializeOwned; use serde::Serialize; -use album::Album; -use artist::Artist; -use config; -use events::EventManager; -use playlist::Playlist; -use spotify::Spotify; -use track::Track; +use crate::album::Album; +use crate::artist::Artist; +use crate::config; +use crate::events::EventManager; +use crate::playlist::Playlist; +use crate::spotify::Spotify; +use crate::track::Track; const CACHE_TRACKS: &str = "tracks.db"; const CACHE_ALBUMS: &str = "albums.db"; diff --git a/src/main.rs b/src/main.rs index cd4f667..de2840d 100644 --- a/src/main.rs +++ b/src/main.rs @@ -69,10 +69,10 @@ mod ui; #[cfg(feature = "mpris")] mod mpris; -use commands::CommandManager; -use events::{Event, EventManager}; -use library::Library; -use spotify::PlayerEvent; +use crate::commands::CommandManager; +use crate::events::{Event, EventManager}; +use crate::library::Library; +use crate::spotify::PlayerEvent; fn setup_logging(filename: &str) -> Result<(), fern::InitError> { fern::Dispatch::new() @@ -103,11 +103,12 @@ fn get_credentials(reset: bool) -> Credentials { error!("could not delete credential file"); } - let creds = ::config::load_or_generate_default(&path, authentication::create_credentials, true) - .unwrap_or_else(|e| { - eprintln!("{}", e); - process::exit(1); - }); + let creds = + crate::config::load_or_generate_default(&path, authentication::create_credentials, true) + .unwrap_or_else(|e| { + eprintln!("{}", e); + process::exit(1); + }); #[cfg(target_family = "unix")] std::fs::set_permissions(path, std::os::unix::fs::PermissionsExt::from_mode(0o600)) @@ -156,13 +157,17 @@ fn main() { // Things here may cause the process to abort; we must do them before creating curses windows // otherwise the error message will not be seen by a user - let cfg: ::config::Config = { + let cfg: crate::config::Config = { let path = config::config_path("config.toml"); - ::config::load_or_generate_default(path, |_| Ok(::config::Config::default()), false) - .unwrap_or_else(|e| { - eprintln!("{}", e); - process::exit(1); - }) + crate::config::load_or_generate_default( + path, + |_| Ok(crate::config::Config::default()), + false, + ) + .unwrap_or_else(|e| { + eprintln!("{}", e); + process::exit(1); + }) }; let mut credentials = get_credentials(false); @@ -178,7 +183,11 @@ fn main() { let event_manager = EventManager::new(cursive.cb_sink().clone()); - let spotify = Arc::new(spotify::Spotify::new(event_manager.clone(), credentials, &cfg)); + let spotify = Arc::new(spotify::Spotify::new( + event_manager.clone(), + credentials, + &cfg, + )); let queue = Arc::new(queue::Queue::new(spotify.clone())); diff --git a/src/mpris.rs b/src/mpris.rs index 01089a6..b436e27 100644 --- a/src/mpris.rs +++ b/src/mpris.rs @@ -8,9 +8,9 @@ use dbus::stdintf::org_freedesktop_dbus::PropertiesPropertiesChanged; use dbus::tree::{Access, Factory}; use dbus::{Path, SignalArgs}; -use queue::{Queue, RepeatSetting}; -use spotify::{PlayerEvent, Spotify}; -use track::Track; +use crate::queue::{Queue, RepeatSetting}; +use crate::spotify::{PlayerEvent, Spotify}; +use crate::track::Track; type Metadata = HashMap>>; struct MprisState(String, Option); diff --git a/src/playlist.rs b/src/playlist.rs index 3b10335..8b46dc9 100644 --- a/src/playlist.rs +++ b/src/playlist.rs @@ -3,12 +3,12 @@ use std::sync::Arc; use rspotify::spotify::model::playlist::{FullPlaylist, SimplifiedPlaylist}; -use library::Library; -use queue::Queue; -use spotify::Spotify; -use track::Track; -use traits::{IntoBoxedViewExt, ListItem, ViewExt}; -use ui::playlist::PlaylistView; +use crate::library::Library; +use crate::queue::Queue; +use crate::spotify::Spotify; +use crate::track::Track; +use crate::traits::{IntoBoxedViewExt, ListItem, ViewExt}; +use crate::ui::playlist::PlaylistView; #[derive(Clone, Debug, Deserialize, Serialize)] pub struct Playlist { diff --git a/src/queue.rs b/src/queue.rs index 56fadf6..68340f6 100644 --- a/src/queue.rs +++ b/src/queue.rs @@ -1,10 +1,11 @@ +use std::cmp::Ordering; use std::sync::{Arc, RwLock}; use rand::prelude::*; use strum_macros::Display; -use spotify::Spotify; -use track::Track; +use crate::spotify::Spotify; +use crate::track::Track; #[derive(Display, Clone, Copy, PartialEq, Debug, Serialize, Deserialize)] pub enum RepeatSetting { @@ -142,11 +143,13 @@ impl Queue { // of the one we deleted let current = *self.current_track.read().unwrap(); if let Some(current_track) = current { - if index == current_track { - self.play(index, false, false); - } else if index < current_track { - let mut current = self.current_track.write().unwrap(); - current.replace(current_track - 1); + match current_track.cmp(&index) { + Ordering::Equal => self.play(index, false, false), + Ordering::Greater => { + let mut current = self.current_track.write().unwrap(); + current.replace(current_track - 1); + } + _ => (), } } diff --git a/src/spotify.rs b/src/spotify.rs index d820728..b6ce1e6 100644 --- a/src/spotify.rs +++ b/src/spotify.rs @@ -42,11 +42,11 @@ use std::sync::RwLock; use std::thread; use std::time::{Duration, SystemTime}; -use artist::Artist; -use config; -use events::{Event, EventManager}; -use track::Track; -use queue; +use crate::artist::Artist; +use crate::config; +use crate::events::{Event, EventManager}; +use crate::queue; +use crate::track::Track; pub const VOLUME_PERCENT: u16 = ((u16::max_value() as f64) * 1.0 / 100.0) as u16; @@ -223,7 +223,7 @@ impl Spotify { let (user_tx, user_rx) = oneshot::channel(); let volume = match &cfg.saved_state { Some(state) => match state.volume { - Some(vol) => ((std::cmp::min(vol, 100) as f32)/100.0 * (0xFFFF as f32)).ceil() as u16, + Some(vol) => ((std::cmp::min(vol, 100) as f32) / 100.0 * 65535_f32).ceil() as u16, None => 0xFFFF as u16, }, None => 0xFFFF as u16, @@ -234,7 +234,7 @@ impl Spotify { "track" => queue::RepeatSetting::RepeatTrack, "playlist" => queue::RepeatSetting::RepeatPlaylist, _ => queue::RepeatSetting::None, - } + }, _ => queue::RepeatSetting::None, }, _ => queue::RepeatSetting::None, @@ -263,8 +263,8 @@ impl Spotify { channel: tx, user: user_rx.wait().expect("error retrieving userid from worker"), volume: AtomicU16::new(volume), - repeat: repeat, - shuffle: shuffle, + repeat, + shuffle, }; // acquire token for web api usage diff --git a/src/theme.rs b/src/theme.rs index 5651bb3..5e8175c 100644 --- a/src/theme.rs +++ b/src/theme.rs @@ -3,7 +3,7 @@ use cursive::theme::Color::*; use cursive::theme::PaletteColor::*; use cursive::theme::*; -use config::Config; +use crate::config::Config; macro_rules! load_color { ( $cfg: expr, $member: ident, $default: expr ) => { diff --git a/src/track.rs b/src/track.rs index ef899f4..9c1c93e 100644 --- a/src/track.rs +++ b/src/track.rs @@ -5,11 +5,11 @@ use chrono::{DateTime, Utc}; use rspotify::spotify::model::album::FullAlbum; use rspotify::spotify::model::track::{FullTrack, SavedTrack, SimplifiedTrack}; -use album::Album; -use artist::Artist; -use library::Library; -use queue::Queue; -use traits::{ListItem, ViewExt}; +use crate::album::Album; +use crate::artist::Artist; +use crate::library::Library; +use crate::queue::Queue; +use crate::traits::{ListItem, ViewExt}; #[derive(Clone, Deserialize, Serialize)] pub struct Track { diff --git a/src/traits.rs b/src/traits.rs index c5b27c3..5a6ed3e 100644 --- a/src/traits.rs +++ b/src/traits.rs @@ -4,13 +4,13 @@ use cursive::view::{View, ViewWrapper}; use cursive::views::NamedView; use cursive::Cursive; -use album::Album; -use artist::Artist; -use command::Command; -use commands::CommandResult; -use library::Library; -use queue::Queue; -use track::Track; +use crate::album::Album; +use crate::artist::Artist; +use crate::command::Command; +use crate::commands::CommandResult; +use crate::library::Library; +use crate::queue::Queue; +use crate::track::Track; pub trait ListItem: Sync + Send + 'static { fn is_playing(&self, queue: Arc) -> bool; diff --git a/src/ui/album.rs b/src/ui/album.rs index 245b0b6..85bab82 100644 --- a/src/ui/album.rs +++ b/src/ui/album.rs @@ -3,15 +3,15 @@ use std::sync::{Arc, RwLock}; use cursive::view::ViewWrapper; use cursive::Cursive; -use album::Album; -use artist::Artist; -use command::Command; -use commands::CommandResult; -use library::Library; -use queue::Queue; -use traits::ViewExt; -use ui::listview::ListView; -use ui::tabview::TabView; +use crate::album::Album; +use crate::artist::Artist; +use crate::command::Command; +use crate::commands::CommandResult; +use crate::library::Library; +use crate::queue::Queue; +use crate::traits::ViewExt; +use crate::ui::listview::ListView; +use crate::ui::tabview::TabView; pub struct AlbumView { album: Album, diff --git a/src/ui/artist.rs b/src/ui/artist.rs index ea19d3c..a47ddc8 100644 --- a/src/ui/artist.rs +++ b/src/ui/artist.rs @@ -4,15 +4,15 @@ use std::thread; use cursive::view::ViewWrapper; use cursive::Cursive; -use artist::Artist; -use command::Command; -use commands::CommandResult; -use library::Library; -use queue::Queue; -use track::Track; -use traits::ViewExt; -use ui::listview::ListView; -use ui::tabview::TabView; +use crate::artist::Artist; +use crate::command::Command; +use crate::commands::CommandResult; +use crate::library::Library; +use crate::queue::Queue; +use crate::track::Track; +use crate::traits::ViewExt; +use crate::ui::listview::ListView; +use crate::ui::tabview::TabView; pub struct ArtistView { artist: Artist, diff --git a/src/ui/contextmenu.rs b/src/ui/contextmenu.rs index ba07b99..77a04c9 100644 --- a/src/ui/contextmenu.rs +++ b/src/ui/contextmenu.rs @@ -4,14 +4,14 @@ use cursive::view::{Margins, ViewWrapper}; use cursive::views::{Dialog, ScrollView, SelectView}; use cursive::Cursive; +use crate::library::Library; +use crate::queue::Queue; +use crate::track::Track; +use crate::traits::ListItem; +use crate::ui::layout::Layout; +use crate::ui::modal::Modal; #[cfg(feature = "share_clipboard")] use clipboard::{ClipboardContext, ClipboardProvider}; -use library::Library; -use queue::Queue; -use track::Track; -use traits::ListItem; -use ui::layout::Layout; -use ui::modal::Modal; pub struct ContextMenu { dialog: Modal, diff --git a/src/ui/help.rs b/src/ui/help.rs index 7a606d0..b1b5a0c 100644 --- a/src/ui/help.rs +++ b/src/ui/help.rs @@ -5,9 +5,9 @@ use cursive::utils::markup::StyledString; use cursive::view::ViewWrapper; use cursive::views::{ScrollView, TextView}; -use command::Command; -use config::config_path; -use traits::ViewExt; +use crate::command::Command; +use crate::config::config_path; +use crate::traits::ViewExt; pub struct HelpView { view: ScrollView, diff --git a/src/ui/layout.rs b/src/ui/layout.rs index 1fcc6ae..5cfb558 100644 --- a/src/ui/layout.rs +++ b/src/ui/layout.rs @@ -12,10 +12,10 @@ use cursive::views::EditView; use cursive::{Cursive, Printer}; use unicode_width::UnicodeWidthStr; -use command::Command; -use commands::CommandResult; -use events; -use traits::{IntoBoxedViewExt, ViewExt}; +use crate::command::Command; +use crate::commands::CommandResult; +use crate::events; +use crate::traits::{IntoBoxedViewExt, ViewExt}; struct Screen { title: String, diff --git a/src/ui/library.rs b/src/ui/library.rs index 59a28c7..8b0b298 100644 --- a/src/ui/library.rs +++ b/src/ui/library.rs @@ -3,14 +3,14 @@ use std::sync::Arc; use cursive::view::ViewWrapper; use cursive::Cursive; -use command::Command; -use commands::CommandResult; -use library::Library; -use queue::Queue; -use traits::ViewExt; -use ui::listview::ListView; -use ui::playlists::PlaylistsView; -use ui::tabview::TabView; +use crate::command::Command; +use crate::commands::CommandResult; +use crate::library::Library; +use crate::queue::Queue; +use crate::traits::ViewExt; +use crate::ui::listview::ListView; +use crate::ui::playlists::PlaylistsView; +use crate::ui::tabview::TabView; pub struct LibraryView { tabs: TabView, diff --git a/src/ui/listview.rs b/src/ui/listview.rs index 29f553d..4d2b37d 100644 --- a/src/ui/listview.rs +++ b/src/ui/listview.rs @@ -9,17 +9,17 @@ use cursive::view::ScrollBase; use cursive::{Cursive, Printer, Rect, Vec2}; use unicode_width::UnicodeWidthStr; +use crate::command::{Command, GotoMode, MoveMode, TargetMode}; +use crate::commands::CommandResult; +use crate::library::Library; +use crate::queue::Queue; +use crate::track::Track; +use crate::traits::{IntoBoxedViewExt, ListItem, ViewExt}; +use crate::ui::album::AlbumView; +use crate::ui::artist::ArtistView; +use crate::ui::contextmenu::ContextMenu; #[cfg(feature = "share_clipboard")] use clipboard::{ClipboardContext, ClipboardProvider}; -use command::{Command, GotoMode, MoveMode, TargetMode}; -use commands::CommandResult; -use library::Library; -use queue::Queue; -use track::Track; -use traits::{IntoBoxedViewExt, ListItem, ViewExt}; -use ui::album::AlbumView; -use ui::artist::ArtistView; -use ui::contextmenu::ContextMenu; pub type Paginator = Box>>) + Send + Sync>; pub struct Pagination { diff --git a/src/ui/playlist.rs b/src/ui/playlist.rs index f3da363..573896a 100644 --- a/src/ui/playlist.rs +++ b/src/ui/playlist.rs @@ -3,14 +3,14 @@ use std::sync::{Arc, RwLock}; use cursive::view::ViewWrapper; use cursive::Cursive; -use command::Command; -use commands::CommandResult; -use library::Library; -use playlist::Playlist; -use queue::Queue; -use track::Track; -use traits::ViewExt; -use ui::listview::ListView; +use crate::command::Command; +use crate::commands::CommandResult; +use crate::library::Library; +use crate::playlist::Playlist; +use crate::queue::Queue; +use crate::track::Track; +use crate::traits::ViewExt; +use crate::ui::listview::ListView; pub struct PlaylistView { playlist: Playlist, diff --git a/src/ui/playlists.rs b/src/ui/playlists.rs index 2b7646f..2204e04 100644 --- a/src/ui/playlists.rs +++ b/src/ui/playlists.rs @@ -4,14 +4,14 @@ use cursive::view::{Margins, ViewWrapper}; use cursive::views::Dialog; use cursive::Cursive; -use command::Command; -use commands::CommandResult; -use library::Library; -use playlist::Playlist; -use queue::Queue; -use traits::ViewExt; -use ui::listview::ListView; -use ui::modal::Modal; +use crate::command::Command; +use crate::commands::CommandResult; +use crate::library::Library; +use crate::playlist::Playlist; +use crate::queue::Queue; +use crate::traits::ViewExt; +use crate::ui::listview::ListView; +use crate::ui::modal::Modal; pub struct PlaylistsView { list: ListView, diff --git a/src/ui/queue.rs b/src/ui/queue.rs index 8d96f21..9506626 100644 --- a/src/ui/queue.rs +++ b/src/ui/queue.rs @@ -6,14 +6,14 @@ use cursive::Cursive; use std::cmp::min; use std::sync::Arc; -use command::{Command, ShiftMode}; -use commands::CommandResult; -use library::Library; -use queue::Queue; -use track::Track; -use traits::ViewExt; -use ui::listview::ListView; -use ui::modal::Modal; +use crate::command::{Command, ShiftMode}; +use crate::commands::CommandResult; +use crate::library::Library; +use crate::queue::Queue; +use crate::track::Track; +use crate::traits::ViewExt; +use crate::ui::listview::ListView; +use crate::ui::modal::Modal; pub struct QueueView { list: ListView, diff --git a/src/ui/search.rs b/src/ui/search.rs index c3f9985..46ad14e 100644 --- a/src/ui/search.rs +++ b/src/ui/search.rs @@ -9,19 +9,19 @@ use cursive::{Cursive, Printer, Vec2}; use std::cell::RefCell; use std::sync::{Arc, Mutex, RwLock}; -use album::Album; -use artist::Artist; -use command::{Command, MoveMode}; -use commands::CommandResult; -use events::EventManager; -use library::Library; -use playlist::Playlist; -use queue::Queue; -use spotify::{Spotify, URIType}; -use track::Track; -use traits::{ListItem, ViewExt}; -use ui::listview::{ListView, Pagination}; -use ui::tabview::TabView; +use crate::album::Album; +use crate::artist::Artist; +use crate::command::{Command, MoveMode}; +use crate::commands::CommandResult; +use crate::events::EventManager; +use crate::library::Library; +use crate::playlist::Playlist; +use crate::queue::Queue; +use crate::spotify::{Spotify, URIType}; +use crate::track::Track; +use crate::traits::{ListItem, ViewExt}; +use crate::ui::listview::{ListView, Pagination}; +use crate::ui::tabview::TabView; pub struct SearchView { results_tracks: Arc>>, diff --git a/src/ui/statusbar.rs b/src/ui/statusbar.rs index f960366..f17673c 100644 --- a/src/ui/statusbar.rs +++ b/src/ui/statusbar.rs @@ -8,9 +8,9 @@ use cursive::vec::Vec2; use cursive::Printer; use unicode_width::UnicodeWidthStr; -use library::Library; -use queue::{Queue, RepeatSetting}; -use spotify::{PlayerEvent, Spotify}; +use crate::library::Library; +use crate::queue::{Queue, RepeatSetting}; +use crate::spotify::{PlayerEvent, Spotify}; pub struct StatusBar { queue: Arc, diff --git a/src/ui/tabview.rs b/src/ui/tabview.rs index 01f74d8..0721998 100644 --- a/src/ui/tabview.rs +++ b/src/ui/tabview.rs @@ -7,9 +7,9 @@ use cursive::traits::View; use cursive::{Cursive, Printer, Vec2}; use unicode_width::UnicodeWidthStr; -use command::{Command, MoveMode}; -use commands::CommandResult; -use traits::{IntoBoxedViewExt, ViewExt}; +use crate::command::{Command, MoveMode}; +use crate::commands::CommandResult; +use crate::traits::{IntoBoxedViewExt, ViewExt}; pub struct Tab { title: String,