From eb9cffbd7ac9976acb11c877aa76df5e0aa8b545 Mon Sep 17 00:00:00 2001 From: Alpha <43486986+sudoAlphaX@users.noreply.github.com> Date: Sun, 16 Mar 2025 16:06:46 +0530 Subject: [PATCH 1/3] feat: hide next episode button on reaching last episode Hides the next episode button if the currently completed episode is the last available episode on the server. Also affects auto-next feature, where it returns to media actions menu on completion of last episode. --- .../cli/interfaces/anilist_interfaces.py | 21 +++++++++++++------ 1 file changed, 15 insertions(+), 6 deletions(-) diff --git a/fastanime/cli/interfaces/anilist_interfaces.py b/fastanime/cli/interfaces/anilist_interfaces.py index d7ebdbd..fdb977a 100644 --- a/fastanime/cli/interfaces/anilist_interfaces.py +++ b/fastanime/cli/interfaces/anilist_interfaces.py @@ -329,8 +329,14 @@ def media_player_controls( media_player_controls(config, fastanime_runtime_state) icons = config.icons - options = { - f"{'⏭ ' if icons else ''}Next Episode": _next_episode, + options = {} + + # Only show Next Episode option if the current episode is not the last one + current_index = available_episodes.index(current_episode_number) + if current_index < len(available_episodes) - 1: + options[f"{'⏭ ' if icons else ''}Next Episode"] = _next_episode + + options.update({ f"{'🔂 ' if icons else ''}Replay": _replay, f"{'⏮ ' if icons else ''}Previous Episode": _previous_episode, f"{'🗃️ ' if icons else ''}Episodes": _episodes, @@ -347,12 +353,15 @@ def media_player_controls( config, fastanime_runtime_state ), f"{'❌ ' if icons else ''}Exit": exit_app, - } + }) if config.auto_next: - print("Auto selecting next episode") - _next_episode() - return + if current_index < len(available_episodes) - 1: + print("Auto selecting next episode") + _next_episode() + return + else: + print("Last episode reached") choices = list(options.keys()) if config.use_fzf: From e6297619d45364a7b95f8c71c041be7139ded6e3 Mon Sep 17 00:00:00 2001 From: Alpha <43486986+sudoAlphaX@users.noreply.github.com> Date: Sun, 16 Mar 2025 19:04:29 +0530 Subject: [PATCH 2/3] feat: return to main menu on blank search term Return to fastanime_main_menu on blank search term. Can be used to cancel the search. --- fastanime/cli/interfaces/anilist_interfaces.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/fastanime/cli/interfaces/anilist_interfaces.py b/fastanime/cli/interfaces/anilist_interfaces.py index fdb977a..119a997 100644 --- a/fastanime/cli/interfaces/anilist_interfaces.py +++ b/fastanime/cli/interfaces/anilist_interfaces.py @@ -1925,6 +1925,10 @@ def _anilist_search(config: "Config", page=1): else: search_term = Prompt.ask("[cyan]Search for[/]") + # Return to main menu if search term is empty + if not search_term.strip(): + return False, "Search canceled - return to main menu" + return AniList.search(query=search_term, page=page) From 67a066f16e700026c0e4fd2e29fc343d766c61af Mon Sep 17 00:00:00 2001 From: Alpha <43486986+sudoAlphaX@users.noreply.github.com> Date: Tue, 18 Mar 2025 06:49:20 +0530 Subject: [PATCH 3/3] feat: toggle auto-next during runtime from media_player_controls Allows user to set or unset auto-next episode from media_player_controls during runtime. This feature was only available in media_actions_menu or config file. --- .../cli/interfaces/anilist_interfaces.py | 77 ++++++++++--------- 1 file changed, 41 insertions(+), 36 deletions(-) diff --git a/fastanime/cli/interfaces/anilist_interfaces.py b/fastanime/cli/interfaces/anilist_interfaces.py index fdb977a..a0a937e 100644 --- a/fastanime/cli/interfaces/anilist_interfaces.py +++ b/fastanime/cli/interfaces/anilist_interfaces.py @@ -336,24 +336,41 @@ def media_player_controls( if current_index < len(available_episodes) - 1: options[f"{'⏭ ' if icons else ''}Next Episode"] = _next_episode - options.update({ - f"{'🔂 ' if icons else ''}Replay": _replay, - f"{'⏮ ' if icons else ''}Previous Episode": _previous_episode, - f"{'🗃️ ' if icons else ''}Episodes": _episodes, - f"{'📀 ' if icons else ''}Change Quality": _change_quality, - f"{'🎧 ' if icons else ''}Change Translation Type": _change_translation_type, - f"{'💽 ' if icons else ''}Servers": _servers, - f"{'📱 ' if icons else ''}Main Menu": lambda: fastanime_main_menu( - config, fastanime_runtime_state - ), - f"{'📜 ' if icons else ''}Media Actions Menu": lambda: media_actions_menu( - config, fastanime_runtime_state - ), - f"{'🔎 ' if icons else ''}Anilist Results Menu": lambda: anilist_results_menu( - config, fastanime_runtime_state - ), - f"{'❌ ' if icons else ''}Exit": exit_app, - }) + def _toggle_auto_next( + config: "Config", fastanime_runtime_state: "FastAnimeRuntimeState" + ): + """helper function to toggle auto next + + Args: + config: [TODO:description] + fastanime_runtime_state: [TODO:description] + """ + config.auto_next = not config.auto_next + media_player_controls(config, fastanime_runtime_state) + + options.update( + { + f"{'🔂 ' if icons else ''}Replay": _replay, + f"{'⏮ ' if icons else ''}Previous Episode": _previous_episode, + f"{'🗃️ ' if icons else ''}Episodes": _episodes, + f"{'📀 ' if icons else ''}Change Quality": _change_quality, + f"{'🎧 ' if icons else ''}Change Translation Type": _change_translation_type, + f"{'💠 ' if icons else ''}Toggle auto next episode": lambda: _toggle_auto_next( + config, fastanime_runtime_state + ), + f"{'💽 ' if icons else ''}Servers": _servers, + f"{'📱 ' if icons else ''}Main Menu": lambda: fastanime_main_menu( + config, fastanime_runtime_state + ), + f"{'📜 ' if icons else ''}Media Actions Menu": lambda: media_actions_menu( + config, fastanime_runtime_state + ), + f"{'🔎 ' if icons else ''}Anilist Results Menu": lambda: anilist_results_menu( + config, fastanime_runtime_state + ), + f"{'❌ ' if icons else ''}Exit": exit_app, + } + ) if config.auto_next: if current_index < len(available_episodes) - 1: @@ -1998,34 +2015,22 @@ def fastanime_main_menu( options = { f"{'🔥 ' if icons else ''}Trending": AniList.get_trending, f"{'🎞️ ' if icons else ''}Recent": _recent, - f"{'📺 ' if icons else ''}Watching": lambda config, - media_list_type="Watching", - page=1: _handle_animelist( + f"{'📺 ' if icons else ''}Watching": lambda config, media_list_type="Watching", page=1: _handle_animelist( config, fastanime_runtime_state, media_list_type, page=page ), - f"{'⏸ ' if icons else ''}Paused": lambda config, - media_list_type="Paused", - page=1: _handle_animelist( + f"{'⏸ ' if icons else ''}Paused": lambda config, media_list_type="Paused", page=1: _handle_animelist( config, fastanime_runtime_state, media_list_type, page=page ), - f"{'🚮 ' if icons else ''}Dropped": lambda config, - media_list_type="Dropped", - page=1: _handle_animelist( + f"{'🚮 ' if icons else ''}Dropped": lambda config, media_list_type="Dropped", page=1: _handle_animelist( config, fastanime_runtime_state, media_list_type, page=page ), - f"{'📑 ' if icons else ''}Planned": lambda config, - media_list_type="Planned", - page=1: _handle_animelist( + f"{'📑 ' if icons else ''}Planned": lambda config, media_list_type="Planned", page=1: _handle_animelist( config, fastanime_runtime_state, media_list_type, page=page ), - f"{'✅ ' if icons else ''}Completed": lambda config, - media_list_type="Completed", - page=1: _handle_animelist( + f"{'✅ ' if icons else ''}Completed": lambda config, media_list_type="Completed", page=1: _handle_animelist( config, fastanime_runtime_state, media_list_type, page=page ), - f"{'🔁 ' if icons else ''}Rewatching": lambda config, - media_list_type="Rewatching", - page=1: _handle_animelist( + f"{'🔁 ' if icons else ''}Rewatching": lambda config, media_list_type="Rewatching", page=1: _handle_animelist( config, fastanime_runtime_state, media_list_type, page=page ), f"{'🔔 ' if icons else ''}Recently Updated Anime": AniList.get_most_recently_updated,