61
README.md
61
README.md
@@ -325,31 +325,32 @@ runtime use the `reload` command.
|
|||||||
|
|
||||||
Possible configuration values are:
|
Possible configuration values are:
|
||||||
|
|
||||||
| Name | Description | Possible values | Default |
|
| Name | Description | Possible values | Default |
|
||||||
|---------------------------------|----------------------------------------------------------------|---------------------------------------------------------------------------|-------------|
|
|---------------------------------|----------------------------------------------------------------|---------------------------------------------------------------------------|---------------------|
|
||||||
| `command_key` | Key to open command line | Single character | `:` |
|
| `command_key` | Key to open command line | Single character | `:` |
|
||||||
| `initial_screen` | Screen to show after startup | `"library"`, `"search"`, `"queue"`, `"cover"`<sup>[1]</sup> | `"library"` |
|
| `initial_screen` | Screen to show after startup | `"library"`, `"search"`, `"queue"`, `"cover"`<sup>[1]</sup> | `"library"` |
|
||||||
| `use_nerdfont` | Turn nerdfont glyphs on/off | `true`, `false` | `false` |
|
| `use_nerdfont` | Turn nerdfont glyphs on/off | `true`, `false` | `false` |
|
||||||
| `flip_status_indicators` | Reverse play/pause icon meaning<sup>[2]</sup> | `true`, `false` | `false` |
|
| `flip_status_indicators` | Reverse play/pause icon meaning<sup>[2]</sup> | `true`, `false` | `false` |
|
||||||
| `backend` | Audio backend to use | String<sup>[3]</sup> | |
|
| `backend` | Audio backend to use | String<sup>[3]</sup> | |
|
||||||
| `backend_device` | Audio device to configure the backend | String | |
|
| `backend_device` | Audio device to configure the backend | String | |
|
||||||
| `audio_cache` | Enable caching of audio files | `true`, `false` | `true` |
|
| `audio_cache` | Enable caching of audio files | `true`, `false` | `true` |
|
||||||
| `audio_cache_size` | Maximum size of audio cache in MiB | Number | |
|
| `audio_cache_size` | Maximum size of audio cache in MiB | Number | |
|
||||||
| `volnorm` | Enable volume normalization | `true`, `false` | `false` |
|
| `volnorm` | Enable volume normalization | `true`, `false` | `false` |
|
||||||
| `volnorm_pregain` | Normalization pregain to apply in dB (if enabled) | Number | `0.0` |
|
| `volnorm_pregain` | Normalization pregain to apply in dB (if enabled) | Number | `0.0` |
|
||||||
| `default_keybindings` | Enable default keybindings | `true`, `false` | `false` |
|
| `default_keybindings` | Enable default keybindings | `true`, `false` | `false` |
|
||||||
| `notify`<sup>[4]</sup> | Enable desktop notifications | `true`, `false` | `false` |
|
| `notify`<sup>[4]</sup> | Enable desktop notifications | `true`, `false` | `false` |
|
||||||
| `bitrate` | Audio bitrate to use for streaming | `96`, `160`, `320` | `320` |
|
| `bitrate` | Audio bitrate to use for streaming | `96`, `160`, `320` | `320` |
|
||||||
| `gapless` | Enable gapless playback | `true`, `false` | `true` |
|
| `gapless` | Enable gapless playback | `true`, `false` | `true` |
|
||||||
| `shuffle` | Set default shuffle state | `true`, `false` | `false` |
|
| `shuffle` | Set default shuffle state | `true`, `false` | `false` |
|
||||||
| `repeat` | Set default repeat mode | `off`, `track`, `playlist` | `off` |
|
| `repeat` | Set default repeat mode | `off`, `track`, `playlist` | `off` |
|
||||||
| `playback_state` | Set default playback state | `"Stopped"`, `"Paused"`, `"Playing"`, `"Default"` | `"Paused"` |
|
| `playback_state` | Set default playback state | `"Stopped"`, `"Paused"`, `"Playing"`, `"Default"` | `"Paused"` |
|
||||||
| `library_tabs` | Tabs to show in library screen | Array of `"tracks"`, `"albums"`, `"artists"`, `"Playlists"`, `"podcasts"` | All tabs |
|
| `library_tabs` | Tabs to show in library screen | Array of `"tracks"`, `"albums"`, `"artists"`, `"Playlists"`, `"podcasts"` | All tabs |
|
||||||
| `cover_max_scale`<sup>[1]</sup> | Set maximum scaling ratio for cover art | Number | `1.0` |
|
| `cover_max_scale`<sup>[1]</sup> | Set maximum scaling ratio for cover art | Number | `1.0` |
|
||||||
| `hide_display_names` | Hides spotify usernames in the library header and on playlists | `true`, `false` | `false` |
|
| `hide_display_names` | Hides spotify usernames in the library header and on playlists | `true`, `false` | `false` |
|
||||||
| `[track_format]` | Set active fields shown in Library/Queue views | See [track formatting](#track-formatting) | |
|
| `statusbar_format` | Formatting for tracks in the statusbar | See [track_formatting](#track-formatting) | `%artists - %track` |
|
||||||
| `[theme]` | Custom theme | See [custom theme](#theming) | |
|
| `[track_format]` | Set active fields shown in Library/Queue views | See [track formatting](#track-formatting) | |
|
||||||
| `[keybindings]` | Custom keybindings | See [custom keybindings](#custom-keybindings) | |
|
| `[theme]` | Custom theme | See [custom theme](#theming) | |
|
||||||
|
| `[keybindings]` | Custom keybindings | See [custom keybindings](#custom-keybindings) | |
|
||||||
|
|
||||||
1. If built with the `cover` feature.
|
1. If built with the `cover` feature.
|
||||||
2. By default the statusbar will show a play icon when a track is playing and
|
2. By default the statusbar will show a play icon when a track is playing and
|
||||||
@@ -442,14 +443,18 @@ search_match = "light red"
|
|||||||
More examples can be found in [this pull request](https://github.com/hrkfdn/ncspot/pull/40).
|
More examples can be found in [this pull request](https://github.com/hrkfdn/ncspot/pull/40).
|
||||||
|
|
||||||
### Track Formatting
|
### Track Formatting
|
||||||
It's possible to customize which fields are shown in Queue/Library views.
|
It's possible to customize how tracks are shown in Queue/Library views and the
|
||||||
|
statusbar, whereas `statusbar_format` will hold the statusbar formatting and
|
||||||
|
`[track_format]` the formatting for tracks in list views.
|
||||||
If you don't define `center` for example, the default value will be used.
|
If you don't define `center` for example, the default value will be used.
|
||||||
Available options for tracks:
|
Available options for tracks: `%artists`, `%title`, `%album`, `%saved`,
|
||||||
`%artists`, `%title`, `%album`, `%saved`, `%duration`
|
`%duration`
|
||||||
|
|
||||||
Default configuration:
|
Default configuration:
|
||||||
|
|
||||||
```toml
|
```toml
|
||||||
|
statusbar_format = "%artists - %title"
|
||||||
|
|
||||||
[track_format]
|
[track_format]
|
||||||
left = "%artists - %title"
|
left = "%artists - %title"
|
||||||
center = "%album"
|
center = "%album"
|
||||||
|
|||||||
@@ -73,6 +73,7 @@ pub struct ConfigValues {
|
|||||||
pub cover_max_scale: Option<f32>,
|
pub cover_max_scale: Option<f32>,
|
||||||
pub playback_state: Option<PlaybackState>,
|
pub playback_state: Option<PlaybackState>,
|
||||||
pub track_format: Option<TrackFormat>,
|
pub track_format: Option<TrackFormat>,
|
||||||
|
pub statusbar_format: Option<String>,
|
||||||
pub library_tabs: Option<Vec<LibraryTab>>,
|
pub library_tabs: Option<Vec<LibraryTab>>,
|
||||||
pub hide_display_names: Option<bool>,
|
pub hide_display_names: Option<bool>,
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -19,7 +19,7 @@ pub enum Playable {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl Playable {
|
impl Playable {
|
||||||
pub fn format(playable: Playable, formatting: String, library: Arc<Library>) -> String {
|
pub fn format(playable: &Playable, formatting: &str, library: Arc<Library>) -> String {
|
||||||
formatting
|
formatting
|
||||||
.replace(
|
.replace(
|
||||||
"%artists",
|
"%artists",
|
||||||
|
|||||||
@@ -192,7 +192,7 @@ impl ListItem for Track {
|
|||||||
let default = config::TrackFormat::default().left.unwrap();
|
let default = config::TrackFormat::default().left.unwrap();
|
||||||
let left = formatting.left.unwrap_or_else(|| default.clone());
|
let left = formatting.left.unwrap_or_else(|| default.clone());
|
||||||
if left != default {
|
if left != default {
|
||||||
Playable::format(Playable::Track(self.clone()), left, library)
|
Playable::format(&Playable::Track(self.clone()), &left, library)
|
||||||
} else {
|
} else {
|
||||||
format!("{}", self)
|
format!("{}", self)
|
||||||
}
|
}
|
||||||
@@ -208,7 +208,7 @@ impl ListItem for Track {
|
|||||||
let default = config::TrackFormat::default().center.unwrap();
|
let default = config::TrackFormat::default().center.unwrap();
|
||||||
let center = formatting.center.unwrap_or_else(|| default.clone());
|
let center = formatting.center.unwrap_or_else(|| default.clone());
|
||||||
if center != default {
|
if center != default {
|
||||||
Playable::format(Playable::Track(self.clone()), center, library)
|
Playable::format(&Playable::Track(self.clone()), ¢er, library)
|
||||||
} else {
|
} else {
|
||||||
self.album.clone().unwrap_or_default()
|
self.album.clone().unwrap_or_default()
|
||||||
}
|
}
|
||||||
@@ -224,7 +224,7 @@ impl ListItem for Track {
|
|||||||
let default = config::TrackFormat::default().right.unwrap();
|
let default = config::TrackFormat::default().right.unwrap();
|
||||||
let right = formatting.right.unwrap_or_else(|| default.clone());
|
let right = formatting.right.unwrap_or_else(|| default.clone());
|
||||||
if right != default {
|
if right != default {
|
||||||
Playable::format(Playable::Track(self.clone()), right, library)
|
Playable::format(&Playable::Track(self.clone()), &right, library)
|
||||||
} else {
|
} else {
|
||||||
let saved = if library.is_saved_track(&Playable::Track(self.clone())) {
|
let saved = if library.is_saved_track(&Playable::Track(self.clone())) {
|
||||||
if library.cfg.values().use_nerdfont.unwrap_or(false) {
|
if library.cfg.values().use_nerdfont.unwrap_or(false) {
|
||||||
|
|||||||
@@ -9,6 +9,7 @@ use cursive::Printer;
|
|||||||
use unicode_width::UnicodeWidthStr;
|
use unicode_width::UnicodeWidthStr;
|
||||||
|
|
||||||
use crate::library::Library;
|
use crate::library::Library;
|
||||||
|
use crate::model::playable::Playable;
|
||||||
use crate::queue::{Queue, RepeatSetting};
|
use crate::queue::{Queue, RepeatSetting};
|
||||||
use crate::spotify::{PlayerEvent, Spotify};
|
use crate::spotify::{PlayerEvent, Spotify};
|
||||||
|
|
||||||
@@ -68,6 +69,17 @@ impl StatusBar {
|
|||||||
(self.spotify.volume() as f64 / 65535_f64 * 100.0).round() as u16
|
(self.spotify.volume() as f64 / 65535_f64 * 100.0).round() as u16
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn format_track(&self, t: &Playable) -> String {
|
||||||
|
let format = self
|
||||||
|
.library
|
||||||
|
.cfg
|
||||||
|
.values()
|
||||||
|
.statusbar_format
|
||||||
|
.clone()
|
||||||
|
.unwrap_or_else(|| "%artists - %title".to_string());
|
||||||
|
Playable::format(t, &format, self.library.clone())
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
impl View for StatusBar {
|
impl View for StatusBar {
|
||||||
@@ -174,7 +186,7 @@ impl View for StatusBar {
|
|||||||
|
|
||||||
printer.with_color(style, |printer| {
|
printer.with_color(style, |printer| {
|
||||||
if let Some(ref t) = self.queue.get_current() {
|
if let Some(ref t) = self.queue.get_current() {
|
||||||
printer.print((4, 1), &t.to_string());
|
printer.print((4, 1), &self.format_track(t));
|
||||||
}
|
}
|
||||||
printer.print((offset, 1), &right);
|
printer.print((offset, 1), &right);
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user