diff --git a/bin/miniplayer b/bin/miniplayer index 687dce0..9b59d73 100755 --- a/bin/miniplayer +++ b/bin/miniplayer @@ -16,6 +16,7 @@ import math # Get config config = configparser.ConfigParser() +config.optionxform = str config.read(os.path.expanduser("~/.config/miniplayer/config")) if "player" not in config.sections(): @@ -46,17 +47,22 @@ if "theme" not in config.sections(): } # Initialise keybindings -default_bindings = {">": "next_track", - "<": "last_track", - "+": "volume_up", - "-": "volume_down", - "p": "play_pause", - "q": "quit", - "h": "help", - "i": "toggle_info", - "down": "select_down", - "up": "select_up", - "enter": "select" +default_bindings = {">": "next_track", + "<": "last_track", + "+": "volume_up", + "-": "volume_down", + "p": "play_pause", + "q": "quit", + "h": "help", + "i": "toggle_info", + "down": "select_down", + "up": "select_up", + "enter": "select", + "x": "shuffle", + "r": "repeat", + "delete": "delete", + "Up": "move_up", + "Down": "move_down" } if "keybindings" not in config.sections(): @@ -244,6 +250,15 @@ class Player: self.last_song = None + # Set repeat flag + current_status = self.client.status() + + if "repeat" in current_status.keys(): + self.repeat = current_status["repeat"] + + else: + self.repeat = 0 + # Album art HTTP server if art_config.get("http_base_url"): @@ -690,26 +705,25 @@ class Player: def handleKeypress(self): """ A function to handle keypresses - - Keys: - '>' -- Next track - '<' -- Last track - '+' -- Volume up +5 - '-' -- Volume down -5 - 'p' -- Play/pause - 'q' -- Quit - 'h' -- Help """ anytime_keys = ["quit", "help", "select_up", "select_down", "select"] + playlist_keys = ["delete", "select_up", "select_down", "select", "move_up", "move_down"] + special_key_map = {curses.KEY_UP: "up", curses.KEY_DOWN: "down", curses.KEY_LEFT: "left", curses.KEY_RIGHT: "right", + 337: "Up", + 336: "Down", + 393: "Left", + 402: "Right", curses.KEY_ENTER: "enter", 10: "enter", - 32: "space" + 32: "space", + 330: "delete", + 263: "backspace" } if self.checkSongUpdate() == 1: @@ -737,6 +751,10 @@ class Player: else: action = keybindings[keyChar] + # Check if key is a playlist key but no playlist showing + if action in playlist_keys and not self.draw_playlist: + key = self.stdscr.getch() + continue if stopped and action not in anytime_keys: key = self.stdscr.getch() @@ -791,6 +809,36 @@ class Player: self.update_needed = True self.last_song = None + elif action == "move_up": + self.control_cycle = 1 + + # No moving up if we're already at the top! + if self.selected_song > 0: + self.client.swap(self.selected_song, self.selected_song - 1) + self.selected_song -= 1 + self.update_needed = True + + elif action == "move_down": + self.control_cycle = 1 + + # No moving down if we're already at the bottom! + if self.selected_song < playlist_length - 1: + self.client.swap(self.selected_song, self.selected_song + 1) + self.selected_song += 1 + self.update_needed = True + + elif action == "repeat": + self.repeat = int(not self.repeat) + self.client.repeat(self.repeat) + self.update_needed = True + + elif action == "shuffle": + self.client.shuffle() + self.update_needed = True + + elif action == "delete": + self.client.delete(self.selected_song % playlist_length) + self.update_needed = True key = self.stdscr.getch() @@ -828,7 +876,9 @@ class Player: self.art_win.addstr( self.text_start + 2, 0, - self.bar_body*(int((self.art_window_width - 1) * self.progress)) + self.bar_head, + self.bar_body * int((self.art_window_width - 1) * self.progress) + + self.bar_head + + " " * int(self.art_window_width * (1 - self.progress)), curses.color_pair(3) ) @@ -841,6 +891,14 @@ class Player: curses.color_pair(2) ) + # Repeat string + if self.repeat: + repeat_string = "r" + self.art_win.addstr( + self.text_start + 3, 0, + repeat_string, + ) + self.art_win.refresh() diff --git a/config.example b/config.example index f2b4121..4852d82 100644 --- a/config.example +++ b/config.example @@ -18,17 +18,22 @@ port = 6600 # pass = example # [keybindings] -# > = next_track -# < = last_track -# + = volume_up -# - = volume_down -# p = play_pause -# q = quit -# h = help -# i = toggle_info -# up = select_up -# down = select_down -# enter = select +# > = next_track +# < = last_track +# + = volume_up +# - = volume_down +# p = play_pause +# q = quit +# h = help +# i = toggle_info +# up = select_up +# down = select_down +# enter = select +# Up = move_up +# Down = move_down +# delete = delete +# x = shuffle +# r = repeat # [theme] # # If a color is set to "auto", it will automatically pick the color based on the album art diff --git a/setup.cfg b/setup.cfg index fbc46cf..9aa6694 100644 --- a/setup.cfg +++ b/setup.cfg @@ -1,6 +1,6 @@ [metadata] name = miniplayer -version = 1.5.2 +version = 1.6.0 description = An mpd client with album art and basic functionality. long_description = file: README.md long_description_content_type = text/markdown