From ed713375ef00a528f6e6a4459a7fe05ab193a6ca Mon Sep 17 00:00:00 2001 From: Benex254 Date: Mon, 5 Aug 2024 09:46:58 +0300 Subject: [PATCH] feat:(anime screen):add basic error handling --- fastanime/Controller/anime_screen.py | 10 +- fastanime/Model/anime_screen.py | 94 ++++++++++--------- fastanime/Utility/downloader/__init__.py | 0 fastanime/View/AnimeScreen/__init__.py | 0 fastanime/View/DownloadsScreen/__init__.py | 0 .../DownloadsScreen/components/__init__.py | 0 fastanime/View/MylistScreen/__init__.py | 0 fastanime/View/SearchScreen/__init__.py | 0 fastanime/libs/anime_provider/__init__.py | 0 fastanime/libs/mpv/__init__.py | 0 pyproject.toml | 33 ------- requirements.txt | 1 - setup.py | 60 ++++++++++++ 13 files changed, 118 insertions(+), 80 deletions(-) create mode 100644 fastanime/Utility/downloader/__init__.py create mode 100644 fastanime/View/AnimeScreen/__init__.py create mode 100644 fastanime/View/DownloadsScreen/__init__.py create mode 100644 fastanime/View/DownloadsScreen/components/__init__.py create mode 100644 fastanime/View/MylistScreen/__init__.py create mode 100644 fastanime/View/SearchScreen/__init__.py create mode 100644 fastanime/libs/anime_provider/__init__.py create mode 100644 fastanime/libs/mpv/__init__.py delete mode 100644 pyproject.toml create mode 100644 setup.py diff --git a/fastanime/Controller/anime_screen.py b/fastanime/Controller/anime_screen.py index 1656fbe..6d129bd 100644 --- a/fastanime/Controller/anime_screen.py +++ b/fastanime/Controller/anime_screen.py @@ -19,10 +19,12 @@ class AnimeScreenController: def fetch_streams(self, anime_title, is_dub=False, episode="1"): if self.view.is_dub: is_dub = self.view.is_dub.active - self.view.current_anime_data = self.model.get_anime_data_from_provider( - anime_title, is_dub - ) - self.view.current_links = self.model.get_episode_streams(episode, is_dub) + if anime_data := self.model.get_anime_data_from_provider( + anime_title, is_dub + ): + self.view.current_anime_data = anime_data + if current_links := self.model.get_episode_streams(episode, is_dub): + self.view.current_links = current_links # TODO: add auto start # # self.view.current_link = self.view.current_links[0]["gogoanime"][0] diff --git a/fastanime/Model/anime_screen.py b/fastanime/Model/anime_screen.py index c69e52e..4751913 100644 --- a/fastanime/Model/anime_screen.py +++ b/fastanime/Model/anime_screen.py @@ -1,5 +1,6 @@ from fuzzywuzzy import fuzz from kivy.cache import Cache +from kivy.logger import Logger from ..libs.anilist import AniList from ..libs.anime_provider.allanime.api import anime_provider @@ -46,55 +47,64 @@ class AnimeScreenModel(BaseScreenModel): current_title = "" def get_anime_data_from_provider(self, anime_title: tuple, is_dub, id=None): - if self.current_title == anime_title and self.current_anime_data: - return self.current_anime_data - translation_type = "dub" if is_dub else "sub" - search_results = anime_provider.search_for_anime( - anime_title[0], translation_type - ) - - if search_results: - _search_results = search_results["shows"]["edges"] - result = max( - _search_results, - key=lambda x: anime_title_percentage_match(x["name"], anime_title), + try: + if self.current_title == anime_title and self.current_anime_data: + return self.current_anime_data + translation_type = "dub" if is_dub else "sub" + search_results = anime_provider.search_for_anime( + anime_title[0], translation_type ) - self.current_anime_id = result["_id"] - self.current_anime_data = anime_provider.get_anime(result["_id"]) - self.current_title = anime_title - return self.current_anime_data - return {} + + if search_results: + _search_results = search_results["shows"]["edges"] + result = max( + _search_results, + key=lambda x: anime_title_percentage_match(x["name"], anime_title), + ) + self.current_anime_id = result["_id"] + self.current_anime_data = anime_provider.get_anime(result["_id"]) + self.current_title = anime_title + return self.current_anime_data + return {} + except Exception as e: + Logger.info("anime_screen error: %s" % e) + return {} def get_episode_streams(self, episode, is_dub): translation_type = "dub" if is_dub else "sub" - if cached_episode := Cache.get( - "streams.anime", f"{self.current_title}{episode}{is_dub}" - ): - return cached_episode - if self.current_anime_data: - episode_streams = anime_provider.get_anime_episode( - self.current_anime_id, episode, translation_type - ) - streams = anime_provider.get_episode_streams(episode_streams) + try: + if cached_episode := Cache.get( + "streams.anime", f"{self.current_title}{episode}{is_dub}" + ): + return cached_episode + if self.current_anime_data: + episode_streams = anime_provider.get_anime_episode( + self.current_anime_id, episode, translation_type + ) + streams = anime_provider.get_episode_streams(episode_streams) - if streams: - _streams = list(streams) - streams = [] - for stream in _streams: - streams.append( - { - f"{stream[0]}": [ - _stream["link"] for _stream in stream[1]["links"] - ] - } - ) - Cache.append( - "streams.anime", - f"{self.current_title}{episode}{is_dub}", - streams, - ) + if streams: + _streams = list(streams) + streams = [] + for stream in _streams: + streams.append( + { + f"{stream[0]}": [ + _stream["link"] for _stream in stream[1]["links"] + ] + } + ) + Cache.append( + "streams.anime", + f"{self.current_title}{episode}{is_dub}", + streams, + ) return streams + return [] + except Exception as e: + Logger.info("anime_screen error: %s" % e) + return [] # should return {type:{provider:streamlink}} diff --git a/fastanime/Utility/downloader/__init__.py b/fastanime/Utility/downloader/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/fastanime/View/AnimeScreen/__init__.py b/fastanime/View/AnimeScreen/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/fastanime/View/DownloadsScreen/__init__.py b/fastanime/View/DownloadsScreen/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/fastanime/View/DownloadsScreen/components/__init__.py b/fastanime/View/DownloadsScreen/components/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/fastanime/View/MylistScreen/__init__.py b/fastanime/View/MylistScreen/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/fastanime/View/SearchScreen/__init__.py b/fastanime/View/SearchScreen/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/fastanime/libs/anime_provider/__init__.py b/fastanime/libs/anime_provider/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/fastanime/libs/mpv/__init__.py b/fastanime/libs/mpv/__init__.py new file mode 100644 index 0000000..e69de29 diff --git a/pyproject.toml b/pyproject.toml deleted file mode 100644 index 0ccf3c5..0000000 --- a/pyproject.toml +++ /dev/null @@ -1,33 +0,0 @@ -[build-system] -requires = ["setuptools"] -build-backend = "setuptools.build_meta" -[project] -name = "AniXStream" -version = "0.0.1" -authors = [ - { name="Benex254", email="benexprojects@gmail.com" }, -] -description = "A wrapper over all and every anime cli or package" -readme = "README.md" -requires-python = ">=3.10" -classifiers = [ - "Programming Language :: Python :: 3", - "License :: OSI Approved :: MIT License", - "Operating System :: OS Independent", -] -dependencies = [ - "kivy", - "plyer", - "fuzzywuzzy", - "python-Levenshtein", - "kivymd @ https://github.com/kivymd/KivyMD/archive/master.zip", - "ffpyplayer", - "pytube", - "animdl" -] -[project.urls] -Homepage = "https://github.com/benex254/aniXstream" -Issues = "https://github.com/benex254/aniXstream" -[project.scripts] -anixstream="anixstream.__main__:run_app" - diff --git a/requirements.txt b/requirements.txt index 356fcb0..111acae 100644 --- a/requirements.txt +++ b/requirements.txt @@ -5,4 +5,3 @@ plyer https://github.com/kivymd/KivyMD/archive/master.zip fuzzywuzzy python-Levenshtein -dotenv diff --git a/setup.py b/setup.py new file mode 100644 index 0000000..4b0b710 --- /dev/null +++ b/setup.py @@ -0,0 +1,60 @@ +import os +import sys + +from setuptools import find_packages, setup + +assert sys.version_info >= (3, 10, 0), "FastAnime requires python 3.10+" + +path = os.path.abspath(".") + +kv_file_paths = [] + +app_dir = os.path.join(path, "fastanime") +print(app_dir) + +views_folder = os.path.join(app_dir, "View") +for dirpath, dirnames, filenames in os.walk(views_folder): + for filename in filenames: + if os.path.splitext(filename)[1] == ".kv": + kv_file = os.path.join(dirpath, filename) + kv_file_paths.append(kv_file) + + +if __name__ == "__main__": + setup( + version="0.2.0", + packages=[ + *find_packages( + include=[ + "fastanime", + "fastanime.*", + "fastanime.Utility.*", + "fastanime.libs.*", + ] + ), + ], + package_dir={"fastanime": "fastanime"}, + package_data={ + "fastanime": [ + "assets/*", + "configs/*", + *kv_file_paths, + ] + }, + install_requires=[ + "kivy", + "plyer", + "fuzzywuzzy", + "python-Levenshtein", + "kivymd @ https://github.com/kivymd/KivyMD/archive/master.zip", + "ffpyplayer", + "yt-dlp", + ], + setup_requires=[], + python_requires=">=3.10", + entry_points={ + "gui_scripts": [ + "fastanime = fastanime.__main__:get_hook_dirs", + ], + }, + )