From 8b62b5322080594e26a793aca21ae9a54a35f6f3 Mon Sep 17 00:00:00 2001 From: jupiterbjy Date: Thu, 9 Dec 2021 03:09:38 +0900 Subject: [PATCH] Now support next track, major fix to player crash in different directory with current playlist. --- CUIAudioPlayer/CompatibilityPatch.py | 77 ------------- CUIAudioPlayer/FileWalker.py | 55 +++++----- CUIAudioPlayer/LoggingConfigurator.py | 7 +- CUIAudioPlayer/Player/PlayerLogic.py | 125 ++++++++++++++-------- CUIAudioPlayer/Player/PlayerStates.py | 48 ++++++--- CUIAudioPlayer/Player/TUI.py | 4 +- CUIAudioPlayer/Player/__init__.py | 11 +- CUIAudioPlayer/SDManager/StreamManager.py | 4 +- CUIAudioPlayer/SDManager/StreamStates.py | 16 ++- CUIAudioPlayer/__main__.py | 7 +- Demo/Images/Demo.png | Bin 82150 -> 30833 bytes README.md | 26 +++-- requirements.txt | 4 +- 13 files changed, 184 insertions(+), 200 deletions(-) delete mode 100644 CUIAudioPlayer/CompatibilityPatch.py diff --git a/CUIAudioPlayer/CompatibilityPatch.py b/CUIAudioPlayer/CompatibilityPatch.py deleted file mode 100644 index d8952c7..0000000 --- a/CUIAudioPlayer/CompatibilityPatch.py +++ /dev/null @@ -1,77 +0,0 @@ -from typing import Union, Iterable -from collections import OrderedDict -import GetModuleReference - - -# Target 3.7 to 3.8, only listing what I'm using. -# will run these in order, so adding suffix as sorting key. - - -def a_suffix_prefix_patch(): - try: - getattr(str, "endswith") - - except AttributeError: - # < Python 3.8 - - def mock_suffix(self: str, suffix: Union[str, Iterable]): - if isinstance(suffix, str): - suffix = [suffix] - - for suffix_candidate in suffix: - # Python's `in` is faster than manual search. - # We first check if sub-string is in string. - if suffix_candidate in self: - - # if it contains, then check again with last char off. - # If it still finds string, it's not suffix. - if suffix_candidate not in self[:-1]: - return True - # If it can't find string, then it's suffix. - - return False - - def mock_prefix(self: str, prefix: Union[str, Iterable]): - if isinstance(prefix, str): - prefix = [prefix] - - for prefix_candidate in prefix: - - if prefix_candidate in self: - if prefix_candidate not in self[1:]: - return True - - return False - - str.endswith = mock_suffix - str.startswith = mock_prefix - - -def b_remove_suffix_prefix_patch(): - """Only applies for str. No bytes.""" - try: - getattr(str, "removesuffix") - except AttributeError: - # < Python 3.9 - - def mock_remove_suffix(self: str, suffix: str): - if self.endswith(suffix): - return self[:-len(suffix)] - - def mock_remove_prefix(self: str, prefix: str): - if self.startswith(prefix): - return self[len(prefix):] - - str.removesuffix = mock_remove_suffix - str.removeprefix = mock_remove_prefix - - -def fetch_and_run_patches(): - blacklist = ["fetch_and_run_patches"] - function_dict = GetModuleReference.list_function(__name__, blacklist, return_dict=True) - - for _, patch in OrderedDict(sorted(function_dict.items())).items(): - patch() - - -fetch_and_run_patches() diff --git a/CUIAudioPlayer/FileWalker.py b/CUIAudioPlayer/FileWalker.py index abe5afe..e6e625a 100644 --- a/CUIAudioPlayer/FileWalker.py +++ b/CUIAudioPlayer/FileWalker.py @@ -17,7 +17,7 @@ # TODO: separate audio related logic from pathwrapper via subclass class PathWrapper: primary_formats = set("." + key.lower() for key in sf.available_formats().keys()) - secondary_formats = {".m4a", ".mp3"} if PY_DUB_ENABLED else {} + secondary_formats = {".m4a", ".mp3"} if PY_DUB_ENABLED else set() supported_formats = primary_formats | secondary_formats supported_formats = supported_formats | set(key.upper() for key in supported_formats) @@ -33,42 +33,43 @@ def __init__(self, path: str = "./"): self.folder_list: List[pathlib.Path] = [] def list_audio(self) -> Generator[pathlib.Path, None, None]: - return (path_obj for path_obj in self.list_file() if path_obj.suffix in self.supported_formats) + yield from (path_obj for path_obj in self.list_file() if path_obj.suffix in self.supported_formats) def list_folder(self) -> Generator[pathlib.Path, None, None]: """ First element will be current folder location. either use next() or list()[1:] to skip it. """ - def generator(): - yield self.current_path.parent - for item in self.current_path.glob("*/"): - if item.is_dir(): - yield item - - return generator() + yield self.current_path.parent + yield from (path_ for path_ in self.current_path.iterdir() if path_.is_dir()) def list_file(self) -> Generator[pathlib.Path, None, None]: """ Can't use glob as it match folders such as .git, using pathlib.Path object instead. """ - return (item for item in self.current_path.glob("*/") if item.is_file()) + yield from (item for item in self.current_path.iterdir() if item.is_file()) - def step_in(self, directory: Union[str, pathlib.Path]): + def step_in(self, directory_idx: int): """ Relative / Absolute paths supported. """ - self.current_path = self.current_path.joinpath(directory) + try: + self.current_path = self.folder_list[directory_idx] + except IndexError as err: + raise NotADirectoryError(f"Directory index {directory_idx} does not exist!") from err + self.refresh_list() return self.current_path - def step_out(self, depth=1): - if depth <= 0: + def step_out(self): + + if self.current_path == self.current_path.parent: return self.current_path - self.current_path = self.current_path.parents[depth - 1] + self.current_path = self.current_path.parent + self.refresh_list() return self.current_path @@ -81,18 +82,12 @@ def refresh_list(self): def fetch_meta(self): # This might have to deal the cases such as path changing before generator fires up. - def generator(): - for file_dir in self.list_audio(): - yield TinyTag.get(file_dir) - - return generator() + for file_dir in self.list_audio(): + yield TinyTag.get(file_dir) def fetch_tag_data(self): - def generator(): - for file_dir in self.list_audio(): - yield TinyTag.get(file_dir) - - return generator() + for file_dir in self.list_audio(): + yield TinyTag.get(file_dir) def __len__(self): return len(self.folder_list) + len(self.audio_file_list) @@ -108,9 +103,9 @@ def __getitem__(self, item: int): return self.audio_file_list[item - len(self.folder_list)] def index(self, target: Union[str, pathlib.Path]): + path_ = pathlib.Path(target) try: - return len(self.folder_list) + self.audio_file_list.index(target) - except ValueError: - # assuming it's pure string directory. - path_converted = pathlib.Path(target) - return len(self.folder_list) + self.audio_file_list.index(path_converted) + return len(self.folder_list) + self.audio_file_list.index(path_) + except ValueError as err: + raise IndexError(f"Cannot find given target '{path_.as_posix()}'!") from err + diff --git a/CUIAudioPlayer/LoggingConfigurator.py b/CUIAudioPlayer/LoggingConfigurator.py index b257927..c2be575 100644 --- a/CUIAudioPlayer/LoggingConfigurator.py +++ b/CUIAudioPlayer/LoggingConfigurator.py @@ -1,6 +1,9 @@ import logging import inspect +from loguru import logger +assert logger +# all below are now deprecated LOG_DETAILED_CALLER = True # This will log where the function is from. @@ -23,6 +26,7 @@ def get_caller_stack_name(depth=1): """ Gets the name of caller. + :param depth: determine which scope to inspect, for nested usage. """ return inspect.stack()[depth][3] @@ -94,7 +98,8 @@ def inner(msg, *args, **kwargs): return inner -logger = CallerLoggedLogger() +# logger = CallerLoggedLogger() + # def logging_decorator(func): # async def inner() diff --git a/CUIAudioPlayer/Player/PlayerLogic.py b/CUIAudioPlayer/Player/PlayerLogic.py index eeb0bce..15a8e0a 100644 --- a/CUIAudioPlayer/Player/PlayerLogic.py +++ b/CUIAudioPlayer/Player/PlayerLogic.py @@ -4,17 +4,16 @@ from __future__ import annotations -import array import itertools from contextlib import contextmanager -from typing import TYPE_CHECKING, Iterable, Callable, Type, Tuple +from typing import TYPE_CHECKING, Iterable, Callable, Type, Tuple, Union import py_cui from FileWalker import PathWrapper -from SDManager.StreamManager import StreamManager +from SDManager.StreamManager import StreamManager, NoAudioPlayingError from LoggingConfigurator import logger from .TUI import AudioPlayerTUI -from .PlayerStates import PlayerStates, AudioUnloaded +from .PlayerStates import PlayerStates, AudioUnloaded, AudioRunning from . import ( add_callback_patch, fit_to_actual_width, @@ -37,23 +36,23 @@ class PlayerLogicMixin: # Excl. Border, Spacing of widget from abs size. usable_offset_y, usable_offset_x = 2, 6 - def _init_playlist(self: AudioPlayer): + def init_playlist(self: AudioPlayer): """ Create itertools.cycle generator that acts as a playlist """ # Shuffling is harder than imagined! # https://engineering.atspotify.com/2014/02/28/how-to-shuffle-songs/ - + copy = [i for i in self.path_wrapper.audio_file_list] cycle_gen = itertools.cycle( - array.array("i", (n for n in range(len(self.path_wrapper.audio_file_list)))) + copy ) - for _ in range(self.currently_playing + 1): - next(cycle_gen) + while next(cycle_gen) != self.current_playing_file: + pass self._current_play_generator = cycle_gen - logger.debug("Initialized playlist generator.") + logger.debug(f"Initialized playlist generator from directory '{self.path_wrapper.current_path.as_posix()}'") def playlist_next(self: AudioPlayer): """ @@ -62,13 +61,11 @@ def playlist_next(self: AudioPlayer): :return: Index of next soundtrack on PathWrapper """ - try: - return next(self._current_play_generator) - except TypeError: - self._init_playlist() - return next(self._current_play_generator) + return next(self._current_play_generator) - def get_absolute_size(self: AudioPlayer, widget: py_cui.widgets.Widget) -> Tuple[int, int]: + def get_absolute_size( + self: AudioPlayer, widget: py_cui.widgets.Widget + ) -> Tuple[int, int]: """ Get absolute dimensions of widget including borders. @@ -80,15 +77,14 @@ def get_absolute_size(self: AudioPlayer, widget: py_cui.widgets.Widget) -> Tuple return abs_y - self.usable_offset_y, abs_x - self.usable_offset_x @property - def currently_playing(self: AudioPlayer) -> int: + def current_playing_idx(self: AudioPlayer) -> int: """ - Returns index of currently played track. Currently using slow method for simplicity. + Returns index of currently played track. :return: index of played file """ - file_name = self.stream.audio_info.loaded_data.name - return self.path_wrapper.index(file_name) + return self.path_wrapper.index(self.current_playing_file) class AudioPlayer(AudioPlayerTUI, PlayerLogicMixin): @@ -114,7 +110,9 @@ def __init__(self, root: py_cui.PyCUI): # -- Key binds self.audio_list.add_key_command(py_cui.keys.KEY_ENTER, self._play_cb_enter) - self.volume_slider.add_key_command(py_cui.keys.KEY_SPACE, self._play_cb_space_bar) + self.volume_slider.add_key_command( + py_cui.keys.KEY_SPACE, self._play_cb_space_bar + ) for widget in ( self.audio_list, @@ -122,15 +120,25 @@ def __init__(self, root: py_cui.PyCUI): self.meta_list, ): widget.add_key_command(py_cui.keys.KEY_SPACE, self._play_cb_space_bar) - widget.add_key_command(py_cui.keys.KEY_LEFT_ARROW, self._adjust_playback_left) - widget.add_key_command(py_cui.keys.KEY_RIGHT_ARROW, self._adjust_playback_right) + widget.add_key_command( + py_cui.keys.KEY_LEFT_ARROW, self._adjust_playback_left + ) + widget.add_key_command( + py_cui.keys.KEY_RIGHT_ARROW, self._adjust_playback_right + ) # -- Color rules self.info_box.add_text_color_rule("ERR:", py_cui.WHITE_ON_RED, "startswith") - self.audio_list.add_text_color_rule(self.symbols["play"], py_cui.WHITE_ON_YELLOW, "contains") - self.audio_list.add_text_color_rule(self.symbols["pause"], py_cui.WHITE_ON_YELLOW, "contains") - self.audio_list.add_text_color_rule(self.symbols["stop"], py_cui.WHITE_ON_YELLOW, "contains") + self.audio_list.add_text_color_rule( + self.symbols["play"], py_cui.WHITE_ON_YELLOW, "contains" + ) + self.audio_list.add_text_color_rule( + self.symbols["pause"], py_cui.WHITE_ON_YELLOW, "contains" + ) + self.audio_list.add_text_color_rule( + self.symbols["stop"], py_cui.WHITE_ON_YELLOW, "contains" + ) self.audio_list.add_text_color_rule( r"DIR", py_cui.CYAN_ON_BLACK, "startswith", include_whitespace=False ) @@ -138,11 +146,14 @@ def __init__(self, root: py_cui.PyCUI): # -- State self.player_state: Type[PlayerStates] = AudioUnloaded self.initial_volume_position = self.volume_slider.get_slider_value() + self.global_volume_multiplier = 0.4 self._digit: int = 0 # -- Path and stream instance self.stream = StreamManager(self.show_progress_wrapper(), self.play_next) + self.volume_callback() self.path_wrapper = PathWrapper() + self.current_playing_file: Union[pathlib.Path, None] = None # -- Generator instance and states self._current_play_generator = None @@ -229,22 +240,25 @@ def volume_callback(self): Callback for volume slider that adjust multiplier inside StreamManager. """ - self.stream.multiplier = self.volume_slider.get_slider_value() / self.initial_volume_position + self.stream.multiplier = self.global_volume_multiplier * ( + self.volume_slider.get_slider_value() / self.initial_volume_position + ) - def play_stream(self, audio_idx=None) -> int: + def play_stream(self, audio_file: Union[None, pathlib.Path] = None, next_=False) -> int: """ Load audio and starts audio stream. Returns True if successful. - :param audio_idx: If not None, will play given index of track instead + :param audio_file: If not None, will play given index of track instead + :param next_: Used to not refresh playlist when playing next. """ - if not audio_idx: - audio_idx = self.selected_idx + if not audio_file: + audio_file = self.selected_idx_path try: - self.stream.load_stream(self.path_wrapper[audio_idx]) + self.stream.load_stream(audio_file) except IndexError: - logger.debug(f"Invalid idx: {audio_idx} / {len(self.path_wrapper)}") + logger.debug(f"Invalid idx: {audio_file} / {len(self.path_wrapper)}") return False except RuntimeError as err: @@ -253,15 +267,18 @@ def play_stream(self, audio_idx=None) -> int: self.write_info(msg) return False - self._refresh_list(search_files=False) + self.current_playing_file = audio_file + self.refresh_list(search_files=False) self.stream.start_stream() - self._init_playlist() + + if not next_: + self.init_playlist() return True # End of primary callback - def _refresh_list(self, search_files=True): + def refresh_list(self, search_files=True): """ Refresh directory contents. If search_files is True, will also update cached files list. Will separate this after changing list generating method to use internal item list of ScrollWidget. @@ -319,7 +336,9 @@ def write_info(self, text: str): if text: # Will have hard time to implement cycling texts. - fit_text = fit_to_actual_width(str(text), self.get_absolute_size(self.info_box)[-1]) + fit_text = fit_to_actual_width( + str(text), self.get_absolute_size(self.info_box)[-1] + ) self.info_box.set_text(fit_text) else: self.info_box.clear() @@ -343,7 +362,9 @@ def _write_to_scroll_widget( def wrapper_gen(): for source_line in lines: - yield from fit_to_actual_width_multiline(source_line, usable_x + offset) + yield from fit_to_actual_width_multiline( + source_line, usable_x + offset + ) for line in wrapper_gen(): widget.add_item(line) @@ -381,7 +402,9 @@ def _mark_target(self, track_idx, replace_target: str): source = self.audio_list.get_item_list() string = source[track_idx] - source[track_idx] = (string[: self._digit] + replace_target + string[self._digit + 1:]) + source[track_idx] = ( + string[: self._digit] + replace_target + string[self._digit + 1:] + ) self.write_audio_list(source) def reset_marking(self, track_idx): @@ -420,7 +443,9 @@ def mark_as_stopped(self, track_idx): self._mark_target(track_idx, self.symbols["stop"]) - def show_progress_wrapper(self, paused=False) -> Callable[[AudioObject.AudioInfo, int], None]: + def show_progress_wrapper( + self, paused=False + ) -> Callable[[AudioObject.AudioInfo, int], None]: """ Wrapper for function that handles progress. Returning callable that is meant to run in sounddevice callback. @@ -443,7 +468,9 @@ def show_progress(audio_info: AudioObject.AudioInfo, current_frame): duration_digit = digit(duration) format_specifier = f"0{duration_digit}.1f" - time_string = f"|{current_frame * duration / max_frame:{format_specifier}}/{duration}" + time_string = ( + f"|{current_frame * duration / max_frame:{format_specifier}}/{duration}" + ) _, x_width = self.info_box.get_absolute_dimensions() @@ -463,7 +490,7 @@ def play_next(self): Play next track. Called by finished callback of sounddevice when conditions are met. """ - logger.debug(f"Proceed: {self.stream.stop_flag}") + logger.debug(f"Stop Flag: {self.stream.stop_flag}") if not self.stream.stop_flag: next_ = self.playlist_next() @@ -471,11 +498,19 @@ def play_next(self): logger.debug(f"Playing Next - {next_}") with self.maintain_current_view(): - if not self.play_stream(next_): + if not self.play_stream(next_, True): + # TODO: add mark_as_error + # TODO: add total player length with playlist gen so it can find infinite fail loop logger.warning("Error playing next track. Moving on.") self.play_next() else: - self.mark_as_playing(self.currently_playing) + # update state + self.player_state = AudioRunning + logger.debug(f"Next track started, state: {self.player_state}") + try: + self.mark_as_playing(self.current_playing_idx) + except IndexError: + pass # Helper functions ----------------------------------------- @@ -517,5 +552,5 @@ def maintain_current_view(self): def _tui_destroy_callback(self): try: self.stream.stop_stream() - except RuntimeError: + except (RuntimeError, NoAudioPlayingError): pass diff --git a/CUIAudioPlayer/Player/PlayerStates.py b/CUIAudioPlayer/Player/PlayerStates.py index 923f847..20a513f 100644 --- a/CUIAudioPlayer/Player/PlayerStates.py +++ b/CUIAudioPlayer/Player/PlayerStates.py @@ -6,7 +6,7 @@ from typing import TYPE_CHECKING from LoggingConfigurator import logger -from SDManager.StreamManager import StreamManager +from SDManager.StreamManager import StreamManager, NoAudioPlayingError if TYPE_CHECKING: from .PlayerLogic import AudioPlayer @@ -48,13 +48,17 @@ def on_stop_click(audio_player: AudioPlayer): try: audio_player.stream.stop_stream() - except (RuntimeError, FileNotFoundError): + except (RuntimeError, FileNotFoundError, NoAudioPlayingError): return with audio_player.maintain_current_view(): # revert texts - audio_player._refresh_list(search_files=False) - audio_player.mark_as_stopped(audio_player.currently_playing) + audio_player.refresh_list(search_files=False) + try: + audio_player.mark_as_stopped(audio_player.current_playing_idx) + except IndexError: + # playing audio is not in current dir, ignore + pass audio_player.write_info("") audio_player.player_state = AudioStopped @@ -79,7 +83,7 @@ def on_reload_click(audio_player: AudioPlayer): widget.clear() audio_player.stream = StreamManager(audio_player.show_progress_wrapper(), audio_player.play_next) - audio_player._refresh_list(search_files=True) + audio_player.refresh_list(search_files=True) audio_player.volume_callback() audio_player.player_state = AudioUnloaded @@ -87,24 +91,26 @@ def on_reload_click(audio_player: AudioPlayer): @staticmethod def on_audio_list_enter_press(audio_player: AudioPlayer): """ - Enters directory if selected item is one of them. Else will stop current track and play selected track. + Enters if selected item is directory. Else will stop current track and play selected track. """ - if audio_player.selected_idx_path in audio_player.path_wrapper.folder_list: - audio_player.path_wrapper.step_in(audio_player.selected_idx_path) - PlayerStates.on_reload_click(audio_player) + if audio_player.selected_idx_path.is_dir(): + audio_player.path_wrapper.step_in(audio_player.selected_idx) + # PlayerStates.on_reload_click(audio_player) + audio_player.refresh_list(search_files=True) else: # force play audio with audio_player.maintain_current_view(): try: audio_player.stream.stop_stream() - except RuntimeError as err: - logger.warning(str(err)) - except FileNotFoundError as err: + except (RuntimeError, FileNotFoundError, NoAudioPlayingError) as err: logger.warning(str(err)) if audio_player.play_stream(): - audio_player.mark_as_playing(audio_player.currently_playing) + try: + audio_player.mark_as_playing(audio_player.current_playing_idx) + except IndexError: + pass audio_player.player_state = AudioRunning @staticmethod @@ -157,7 +163,10 @@ def on_audio_list_space_press(audio_player: AudioPlayer): with audio_player.maintain_current_view(): audio_player.stream.start_stream() - audio_player.mark_as_playing(audio_player.currently_playing) + try: + audio_player.mark_as_playing(audio_player.current_playing_idx) + except IndexError: + pass audio_player.player_state = AudioRunning @@ -190,7 +199,6 @@ def on_next_track_click(audio_player: AudioPlayer): """ audio_player.stream.stop_stream(run_finished_callback=False) - audio_player.player_state = AudioStopped @staticmethod def on_audio_list_space_press(audio_player: AudioPlayer): @@ -200,7 +208,10 @@ def on_audio_list_space_press(audio_player: AudioPlayer): with audio_player.maintain_current_view(): audio_player.stream.pause_stream() - audio_player.mark_as_paused(audio_player.currently_playing) + try: + audio_player.mark_as_paused(audio_player.current_playing_idx) + except IndexError: + pass audio_player.player_state = AudioPaused @@ -250,7 +261,10 @@ def on_audio_list_space_press(audio_player: AudioPlayer): with audio_player.maintain_current_view(): audio_player.stream.pause_stream() - audio_player.mark_as_playing(audio_player.currently_playing) + try: + audio_player.mark_as_playing(audio_player.current_playing_idx) + except IndexError: + pass audio_player.player_state = AudioRunning diff --git a/CUIAudioPlayer/Player/TUI.py b/CUIAudioPlayer/Player/TUI.py index fcb730a..99fb147 100644 --- a/CUIAudioPlayer/Player/TUI.py +++ b/CUIAudioPlayer/Player/TUI.py @@ -18,7 +18,7 @@ def __init__(self, root: py_cui.PyCUI): self.meta_list = self._root.add_scroll_menu("Meta", 0, 5, column_span=2, row_span=5) self.info_box = self._root.add_text_box("Info", 3, 0, column_span=4) - self.volume_slider = self._root.add_slider("Volume", 3, 4, column_span=1, min_val=0, max_val=10, init_val=8) + self.volume_slider = self._root.add_slider("Volume", 3, 4, column_span=1, min_val=0, max_val=10, init_val=6) self.play_btn = self._root.add_button("Play", 4, 0) self.stop_btn = self._root.add_button("Stop", 4, 1) @@ -32,7 +32,7 @@ def __init__(self, root: py_cui.PyCUI): # Theme changes self.volume_slider.toggle_value() - self.volume_slider.align_to_bottom() + self.volume_slider.align_to_middle() self.volume_slider.set_bar_char("█") self.play_btn.set_color(py_cui.YELLOW_ON_BLACK) diff --git a/CUIAudioPlayer/Player/__init__.py b/CUIAudioPlayer/Player/__init__.py index 2308ba4..fd27b0d 100644 --- a/CUIAudioPlayer/Player/__init__.py +++ b/CUIAudioPlayer/Player/__init__.py @@ -12,13 +12,14 @@ def add_callback_patch(widget_: py_cui.widgets.Widget, callback: Callable, keypr """ Adding callback support for widget that lacks such as ScrollMenu. - :param widget_: Any widget you want to add callback on each input events. - :param callback: Any callables - :param keypress_only: Decides whether to replace mouse input handler alongside with key input one. + Args: + widget_: Any widget you want to add callback on each input events. + callback: Any callables + keypress_only: Decides whether to replace mouse input handler alongside with key input one. """ # Sequence is _draw -> _handle_mouse_press, so patching on _draw results 1 update behind. - # Therefore we need to patch both _handle_mouse_press and _handle_keyboard_press. + # Therefore, we need to patch both _handle_mouse_press and _handle_keyboard_press. def patch_factory(old_func): # fix for late binding issue: stackoverflow.com/questions/3431676 @@ -109,7 +110,7 @@ def fit_to_actual_width(text: str, length_lim: int) -> str: limited = source[:length_lim] # if last character was 2-width, padding unicode wore off, so last 2-width character can't fit. - # instead pad with space for consistent ellipsis position. + # instead, pad with space for consistent ellipsis position. if wcwidth(limited[-1]) == 2: limited = limited[:-1] + " " else: diff --git a/CUIAudioPlayer/SDManager/StreamManager.py b/CUIAudioPlayer/SDManager/StreamManager.py index ab3f8d0..74bbac0 100644 --- a/CUIAudioPlayer/SDManager/StreamManager.py +++ b/CUIAudioPlayer/SDManager/StreamManager.py @@ -4,7 +4,7 @@ from .AudioObject import AudioInfo import sounddevice as sd -from .StreamStates import StreamState, AudioUnloadedState +from .StreamStates import StreamState, AudioUnloadedState, NoAudioPlayingError from LoggingConfigurator import logger @@ -48,5 +48,5 @@ def pause_stream(self): def __del__(self): try: self.stream_state.stop_stream(self) - except (RuntimeError, FileNotFoundError): + except (RuntimeError, FileNotFoundError, NoAudioPlayingError): pass diff --git a/CUIAudioPlayer/SDManager/StreamStates.py b/CUIAudioPlayer/SDManager/StreamStates.py index 1fdcde5..7e31d63 100644 --- a/CUIAudioPlayer/SDManager/StreamStates.py +++ b/CUIAudioPlayer/SDManager/StreamStates.py @@ -14,6 +14,10 @@ """ +class NoAudioPlayingError(Exception): + pass + + class StreamState: @staticmethod def start_stream(stream_manager: StreamManager): @@ -39,11 +43,11 @@ def start_stream(stream_manager: StreamManager): @staticmethod def stop_stream(stream_manager: StreamManager): - raise FileNotFoundError("No audio file is loaded.") + raise NoAudioPlayingError("No audio file is loaded.") @staticmethod def pause_stream(stream_manager: StreamManager): - raise FileNotFoundError("No audio file is loaded.") + raise NoAudioPlayingError("No audio file is loaded.") @staticmethod def load_stream(stream_manager: StreamManager, audio_dir: str): @@ -68,12 +72,12 @@ def load_stream(stream_manager: StreamManager, audio_dir: str): class StreamStoppedState(StreamState): @staticmethod def stop_stream(stream_manager: StreamManager): - raise RuntimeError("Stream is not active.") + raise NoAudioPlayingError("Stream is not active.") @staticmethod def pause_stream(stream_manager: StreamManager): stream_manager.stream.stop() - raise RuntimeError("Stream is not active.") + raise NoAudioPlayingError("Stream is not active.") @staticmethod def start_stream(stream_manager: StreamManager): @@ -89,7 +93,7 @@ def start_stream(stream_manager: StreamManager): @staticmethod def load_stream(stream_manager: StreamManager, audio_dir: str): logger.debug("Loading new file.") - logger.debug("Delegating to: StreamPlayingState.stop_stream") + logger.debug("Delegating to: StreamPlayingState.load_stream") AudioUnloadedState.load_stream(stream_manager, audio_dir) @@ -118,6 +122,7 @@ def load_stream(stream_manager: StreamManager, audio_dir: str): logger.debug("Stopping and loading new audio.") logger.debug("Delegating to: StreamPlayingState.stop_stream") StreamPlayingState.stop_stream(stream_manager) + logger.debug("Delegating to: AudioUnloadedState.load_stream") AudioUnloadedState.load_stream(stream_manager, audio_dir) @@ -142,4 +147,5 @@ def load_stream(stream_manager: StreamManager, audio_dir: str): logger.debug("Stopping and loading new audio.") logger.debug("Delegating to: StreamPlayingState.stop_stream") StreamPlayingState.stop_stream(stream_manager) + logger.debug("Delegating to: AudioUnloadedState.load_stream") AudioUnloadedState.load_stream(stream_manager, audio_dir) diff --git a/CUIAudioPlayer/__main__.py b/CUIAudioPlayer/__main__.py index eddf68a..ba1b490 100644 --- a/CUIAudioPlayer/__main__.py +++ b/CUIAudioPlayer/__main__.py @@ -2,7 +2,6 @@ from sys import platform import py_cui -import CompatibilityPatch from LoggingConfigurator import logger from Player.PlayerLogic import AudioPlayer @@ -13,10 +12,8 @@ except ImportError: pass -assert CompatibilityPatch - -VERSION_TAG = "0.0.3a - dev" +VERSION_TAG = "0.0.4a - dev" logger.debug(f"Platform: {platform} Version: {VERSION_TAG}") @@ -28,7 +25,7 @@ def draw_player(): TUI driver """ - root = py_cui.PyCUI(5, 7) + root = py_cui.PyCUI(5, 7, auto_focus_buttons=True) root.set_title(f"CUI Audio Player - v{VERSION_TAG}") root.set_widget_border_characters("╔", "╗", "╚", "╝", "═", "║") root.set_refresh_timeout(0.1) diff --git a/Demo/Images/Demo.png b/Demo/Images/Demo.png index 3ff7612078a5d532d757a7e1ebe53edd1c8a9d90..9e3f2cd98a05aa9aa3bb86453e0c5cb962fd1e8b 100644 GIT binary patch literal 30833 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

f~$N>-yDH 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 diff --git a/README.md b/README.md index 587a151..ee7411d 100644 --- a/README.md +++ b/README.md @@ -1,14 +1,16 @@ # CUI Audio Player +![](Demo/Images/Demo.png) + --- -Still under heavy development, expect tons of bugs. +Still under heavy(and slow) development, expect tons of bugs. -- Python 3.8 ~ 3.9+ +- Python 3.9+ - Requires ```master``` branch of [py_cui](https://github.com/jwlodek/py_cui) - Requires CMD on Windows, changing font may be necessary depending on your codepage. -*0.0.3a - dev* +(a bit old demo) ![](Demo/Images/Demo.webp) --- @@ -104,14 +106,18 @@ Will mark those if it's implemented. - [x] Continues play - works mostly. - [x] Volume control (SW) - [x] Jump to section - - [ ] Previous / Next track + - [x] Next track + - [ ] Previous track - [ ] mp3 / m4a support - might require pydub and conversion. -- [ ] Shuffle -- [ ] Album art visualizing on some sort of ascii art. -- [ ] lrc support -- [ ] Show freq. map -- [ ] favorites -- [ ] Server - client stream + +Probably never list: + - [ ] Shuffle +~~ - [ ] Album art visualizing on some sort of ascii art. ~~ Can't get reasonable quality. + - [ ] lrc support + - [ ] Show freq. map + - [ ] favorites + - [ ] Server - client stream + - [ ] Arguments --- ## Things to overcome / overcame diff --git a/requirements.txt b/requirements.txt index 7832702..c517df2 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,4 +2,6 @@ sounddevice>=0.4.1 SoundFile>=0.10.3.post1 tinytag>=1.5.0 wcwidth>=0.2.5 --e https://github.com/jwlodek/py_cui.git +numpy +loguru +git+https://github.com/jwlodek/py_cui.git