From aabd356c0b98222855373413b17d420fa3f37760 Mon Sep 17 00:00:00 2001 From: Benex254 Date: Sun, 11 Aug 2024 16:32:02 +0300 Subject: [PATCH] refactor: provider anime episodes menu --- .../cli/interfaces/anilist_interfaces.py | 108 +++++++++++------- fastanime/cli/utils/player.py | 68 ++++++----- 2 files changed, 107 insertions(+), 69 deletions(-) diff --git a/fastanime/cli/interfaces/anilist_interfaces.py b/fastanime/cli/interfaces/anilist_interfaces.py index b5b4357..1e87008 100644 --- a/fastanime/cli/interfaces/anilist_interfaces.py +++ b/fastanime/cli/interfaces/anilist_interfaces.py @@ -48,8 +48,8 @@ def player_controls(config: "Config", fastanime_runtime_state: FastAnimeRuntimeS config.translation_type.lower() # internal config - current_episode: str = fastanime_runtime_state.episode_number - episodes: list = sorted(fastanime_runtime_state.episodes, key=float) + current_episode: str = fastanime_runtime_state.provider_current_episode_number + episodes: list = sorted(fastanime_runtime_state.provider_total_episodes, key=float) links: list = fastanime_runtime_state.current_stream_links current_link: str = fastanime_runtime_state.current_stream_link anime_title: str = fastanime_runtime_state.provider_anime_title @@ -162,7 +162,7 @@ def player_controls(config: "Config", fastanime_runtime_state: FastAnimeRuntimeS next_episode = len(episodes) - 1 # updateinternal config - fastanime_runtime_state.episode_number = episodes[next_episode] + fastanime_runtime_state.provider_current_episode_number = episodes[next_episode] # update user config config.update_watch_history(anime_id, episodes[next_episode]) @@ -175,14 +175,14 @@ def player_controls(config: "Config", fastanime_runtime_state: FastAnimeRuntimeS config.continue_from_history = False # call interface - fetch_episode(config, fastanime_runtime_state) + provider_anime_episodes_menu(config, fastanime_runtime_state) def _previous_episode(): prev_episode = episodes.index(current_episode) - 1 if prev_episode <= 0: prev_episode = 0 # fastanime_runtime_state.episode_title = episode["title"] - fastanime_runtime_state.episode_number = episodes[prev_episode] + fastanime_runtime_state.provider_current_episode_number = episodes[prev_episode] # update user config config.update_watch_history(anime_id, episodes[prev_episode]) @@ -271,10 +271,10 @@ def fetch_streams(config: "Config", fastanime_runtime_state: FastAnimeRuntimeSta quality: str = config.quality # internal config - episode_number: str = fastanime_runtime_state.episode_number + episode_number: str = fastanime_runtime_state.provider_current_episode_number anime_title: str = fastanime_runtime_state.provider_anime_title anime_id: int = fastanime_runtime_state.selected_anime_id_anilist - anime: "Anime" = fastanime_runtime_state.anime + anime: "Anime" = fastanime_runtime_state.provider_anime translation_type = config.translation_type anime_provider = config.anime_provider @@ -333,7 +333,7 @@ def fetch_streams(config: "Config", fastanime_runtime_state: FastAnimeRuntimeSta # reset watch_history config.update_watch_history(anime_id, None) - fetch_episode(config, fastanime_runtime_state) + provider_anime_episodes_menu(config, fastanime_runtime_state) return elif server == "top": selected_server = episode_streams_dict[list(episode_streams_dict.keys())[0]] @@ -435,81 +435,106 @@ def fetch_streams(config: "Config", fastanime_runtime_state: FastAnimeRuntimeSta player_controls(config, fastanime_runtime_state) -def fetch_episode(config: "Config", fastanime_runtime_state: FastAnimeRuntimeState): +def provider_anime_episodes_menu( + config: "Config", fastanime_runtime_state: FastAnimeRuntimeState +): # user config translation_type: str = config.translation_type.lower() continue_from_history: bool = config.continue_from_history user_watch_history: dict = config.watch_history - anime_id: int = fastanime_runtime_state.selected_anime_id_anilist - anime_title: str = fastanime_runtime_state.provider_anime_title - # internal config - anime: "Anime" = fastanime_runtime_state.anime - _anime: "SearchResult" = fastanime_runtime_state.provider_anime_search_result + # runtime configuration + anime_id_anilist: int = fastanime_runtime_state.selected_anime_id_anilist + anime_title: str = fastanime_runtime_state.provider_anime_title + provider_anime: "Anime" = fastanime_runtime_state.provider_anime selected_anime_anilist: "AnilistBaseMediaDataSchema" = ( fastanime_runtime_state.selected_anime_anilist ) + # prompt for episode number - episodes = anime["availableEpisodesDetail"][translation_type] - episode_number = "" + total_episodes = provider_anime["availableEpisodesDetail"][translation_type] + current_episode_number = "" + + # auto select episode if continue from history otherwise prompt episode number if continue_from_history: - if user_watch_history.get(str(anime_id), {}).get("episode") in episodes: - episode_number = user_watch_history[str(anime_id)]["episode"] - print(f"[bold cyan]Continuing from Episode:[/] [bold]{episode_number}[/]") + # the user watch history thats locally available + # will be preferred over remote + if ( + user_watch_history.get(str(anime_id_anilist), {}).get("episode") + in total_episodes + ): + current_episode_number = user_watch_history[str(anime_id_anilist)][ + "episode" + ] + print( + f"[bold cyan]Continuing from Episode:[/] [bold]{current_episode_number}[/]" + ) + + # try to get the episode from anilist if present elif selected_anime_anilist["mediaListEntry"]: - episode_number = str( - (selected_anime_anilist["mediaListEntry"] or {"progress": ""}).get( + current_episode_number = str( + (selected_anime_anilist["mediaListEntry"] or {"progress": 0}).get( "progress" ) ) - if episode_number not in episodes: - episode_number = "" - print(f"[bold cyan]Continuing from Episode:[/] [bold]{episode_number}[/]") + if current_episode_number not in total_episodes: + current_episode_number = "" + print( + f"[bold cyan]Continuing from Episode:[/] [bold]{current_episode_number}[/]" + ) + # reset to none if not found else: - episode_number = "" + current_episode_number = "" - if not episode_number: - choices = [*episodes, "Back"] + # prompt for episode number if not set + if not current_episode_number: + choices = [*total_episodes, "Back"] if config.use_fzf: - episode_number = fzf.run( + current_episode_number = fzf.run( choices, prompt="Select Episode:", header=anime_title, ) elif config.use_rofi: - episode_number = Rofi.run(choices, "Select Episode") + current_episode_number = Rofi.run(choices, "Select Episode") else: - episode_number = fuzzy_inquirer( + current_episode_number = fuzzy_inquirer( choices, "Select Episode", ) - if episode_number == "Back": + if current_episode_number == "Back": anilist_media_actions_menu(config, fastanime_runtime_state) return - start_time = user_watch_history.get(str(anime_id), {}).get("start_time", "0") - config.update_watch_history(anime_id, episode_number, start_time=start_time) - # update internal config - fastanime_runtime_state.episodes = episodes - # fastanime_runtime_state.episode_title = episode["title"] - fastanime_runtime_state.episode_number = episode_number + # try to get the start time and if not found default to "0" + start_time = user_watch_history.get(str(anime_id_anilist), {}).get( + "start_time", "0" + ) + config.update_watch_history( + anime_id_anilist, current_episode_number, start_time=start_time + ) + + # update runtime data + fastanime_runtime_state.provider_total_episodes = total_episodes + fastanime_runtime_state.provider_current_episode_number = current_episode_number # next interface fetch_streams(config, fastanime_runtime_state) -def fetch_anime_episode(config, fastanime_runtime_state: FastAnimeRuntimeState): +# WARNING: Marked for deletion, the function is quite useless and function calls in python are expensive +def fetch_anime_episode(config, fastanime_runtime_state: "FastAnimeRuntimeState"): selected_anime: "SearchResult" = ( fastanime_runtime_state.provider_anime_search_result ) anime_provider = config.anime_provider with Progress() as progress: progress.add_task("Fetching Anime Info...", total=None) - fastanime_runtime_state.anime = anime_provider.get_anime( + provider_anime = anime_provider.get_anime( selected_anime["id"], fastanime_runtime_state.selected_anime_anilist ) - if not fastanime_runtime_state.anime: + if not provider_anime: print( "Sth went wrong :cry: this could mean the provider is down or your internet" ) @@ -521,7 +546,8 @@ def fetch_anime_episode(config, fastanime_runtime_state: FastAnimeRuntimeState): fetch_anime_episode(config, fastanime_runtime_state) return - fetch_episode(config, fastanime_runtime_state) + fastanime_runtime_state.provider_anime = provider_anime + provider_anime_episodes_menu(config, fastanime_runtime_state) # diff --git a/fastanime/cli/utils/player.py b/fastanime/cli/utils/player.py index e0fe144..2ccba6e 100644 --- a/fastanime/cli/utils/player.py +++ b/fastanime/cli/utils/player.py @@ -38,11 +38,15 @@ class MpvPlayer(object): ): fastanime_runtime_state = self.fastanime_runtime_state config = self.config - episode_number: str = fastanime_runtime_state.episode_number + current_episode_number: str = ( + fastanime_runtime_state.provider_current_episode_number + ) quality = config.quality - episodes: list = sorted(fastanime_runtime_state.episodes, key=float) - anime_id: int = fastanime_runtime_state.selected_anime_id_anilist - anime = fastanime_runtime_state.anime + total_episodes: list = sorted( + fastanime_runtime_state.provider_total_episodes, key=float + ) + anime_id_anilist: int = fastanime_runtime_state.selected_anime_id_anilist + provider_anime = fastanime_runtime_state.provider_anime translation_type = config.translation_type anime_provider = config.anime_provider self.last_stop_time: str = "0" @@ -53,49 +57,57 @@ class MpvPlayer(object): # next or prev if type == "next": self.mpv_player.show_text("Fetching next episode...") - next_episode = episodes.index(episode_number) + 1 - if next_episode >= len(episodes): - next_episode = len(episodes) - 1 - fastanime_runtime_state.episode_number = episodes[next_episode] - episode_number = fastanime_runtime_state.episode_number - config.update_watch_history(anime_id, str(episode_number)) + next_episode = total_episodes.index(current_episode_number) + 1 + if next_episode >= len(total_episodes): + next_episode = len(total_episodes) - 1 + fastanime_runtime_state.provider_current_episode_number = total_episodes[ + next_episode + ] + current_episode_number = ( + fastanime_runtime_state.provider_current_episode_number + ) + config.update_watch_history(anime_id_anilist, str(current_episode_number)) elif type == "reload": - if episode_number not in episodes: + if current_episode_number not in total_episodes: self.mpv_player.show_text("Episode not available") return self.mpv_player.show_text("Replaying Episode...") elif type == "custom": - if not ep_no or ep_no not in episodes: + if not ep_no or ep_no not in total_episodes: self.mpv_player.show_text("Episode number not specified or invalid") self.mpv_player.show_text( - f"Acceptable episodes are: {episodes}", + f"Acceptable episodes are: {total_episodes}", ) return self.mpv_player.show_text(f"Fetching episode {ep_no}") - episode_number = ep_no - config.update_watch_history(anime_id, str(ep_no)) - fastanime_runtime_state.episode_number = str(ep_no) + current_episode_number = ep_no + config.update_watch_history(anime_id_anilist, str(ep_no)) + fastanime_runtime_state.provider_current_episode_number = str(ep_no) else: self.mpv_player.show_text("Fetching previous episode...") - prev_episode = episodes.index(episode_number) - 1 + prev_episode = total_episodes.index(current_episode_number) - 1 if prev_episode <= 0: prev_episode = 0 - fastanime_runtime_state.episode_number = episodes[prev_episode] - episode_number = fastanime_runtime_state.episode_number - config.update_watch_history(anime_id, str(episode_number)) + fastanime_runtime_state.provider_current_episode_number = total_episodes[ + prev_episode + ] + current_episode_number = ( + fastanime_runtime_state.provider_current_episode_number + ) + config.update_watch_history(anime_id_anilist, str(current_episode_number)) # update episode progress - if config.user and episode_number: + if config.user and current_episode_number: AniList.update_anime_list( { - "mediaId": anime_id, - "progress": episode_number, + "mediaId": anime_id_anilist, + "progress": current_episode_number, } ) # get them juicy streams episode_streams = anime_provider.get_episode_streams( - anime, - episode_number, + provider_anime, + current_episode_number, translation_type, fastanime_runtime_state.selected_anime_anilist, ) @@ -225,9 +237,9 @@ class MpvPlayer(object): if not anime: mpv_player.show_text("Failed to update translation type") return - fastanime_runtime_state.episodes = anime["availableEpisodesDetail"][ - translation_type - ] + fastanime_runtime_state.provider_total_episodes = anime[ + "availableEpisodesDetail" + ][translation_type] config.translation_type = translation_type if config.translation_type == "dub":