diff --git a/fastanime/api/__init__.py b/fastanime/api/__init__.py deleted file mode 100644 index 95d669e..0000000 --- a/fastanime/api/__init__.py +++ /dev/null @@ -1,2 +0,0 @@ -def run_api(): - pass diff --git a/fastanime/assets/banner.jpg b/fastanime/assets/banner.jpg deleted file mode 100644 index 9d677c4..0000000 Binary files a/fastanime/assets/banner.jpg and /dev/null differ diff --git a/fastanime/assets/banner_1.jpg b/fastanime/assets/banner_1.jpg deleted file mode 100644 index dd53ef4..0000000 Binary files a/fastanime/assets/banner_1.jpg and /dev/null differ diff --git a/fastanime/assets/default.jpg b/fastanime/assets/default.jpg deleted file mode 100644 index 4b9d335..0000000 Binary files a/fastanime/assets/default.jpg and /dev/null differ diff --git a/fastanime/assets/default_1.jpg b/fastanime/assets/default_1.jpg deleted file mode 100644 index 7108a81..0000000 Binary files a/fastanime/assets/default_1.jpg and /dev/null differ diff --git a/fastanime/assets/logo.ico b/fastanime/assets/logo.ico deleted file mode 100644 index 94eb8b9..0000000 Binary files a/fastanime/assets/logo.ico and /dev/null differ diff --git a/fastanime/assets/logo.png b/fastanime/assets/logo.png deleted file mode 100644 index 13ba5af..0000000 Binary files a/fastanime/assets/logo.png and /dev/null differ diff --git a/fastanime/gui/Controller/__init__.py b/fastanime/gui/Controller/__init__.py deleted file mode 100644 index 8b13789..0000000 --- a/fastanime/gui/Controller/__init__.py +++ /dev/null @@ -1 +0,0 @@ - diff --git a/fastanime/gui/Controller/anime_screen.py b/fastanime/gui/Controller/anime_screen.py deleted file mode 100644 index abdd855..0000000 --- a/fastanime/gui/Controller/anime_screen.py +++ /dev/null @@ -1,38 +0,0 @@ -from kivy.cache import Cache - -from ..Model.anime_screen import AnimeScreenModel -from ..View.AnimeScreen.anime_screen import AnimeScreenView - -Cache.register("data.anime", limit=20, timeout=600) - - -class AnimeScreenController: - """The controller for the anime screen""" - - def __init__(self, model: AnimeScreenModel): - self.model = model - self.view = AnimeScreenView(controller=self, model=self.model) - - def get_view(self) -> AnimeScreenView: - return self.view - - def fetch_streams(self, anime_title, is_dub=False, episode="1"): - if self.view.is_dub: - is_dub = self.view.is_dub.active - 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] - - def update_anime_view(self, id, title, caller_screen_name): - self.fetch_streams(title) - self.view.current_title = title - self.view.caller_screen_name = caller_screen_name - - -__all__ = ["AnimeScreenController"] diff --git a/fastanime/gui/Controller/downloads_screen.py b/fastanime/gui/Controller/downloads_screen.py deleted file mode 100644 index 96b2d22..0000000 --- a/fastanime/gui/Controller/downloads_screen.py +++ /dev/null @@ -1,16 +0,0 @@ -from ..Model.download_screen import DownloadsScreenModel -from ..View.DownloadsScreen.download_screen import DownloadsScreenView - - -class DownloadsScreenController: - """The controller for the download screen""" - - def __init__(self, model: DownloadsScreenModel): - self.model = model - self.view = DownloadsScreenView(controller=self, model=self.model) - - def get_view(self) -> DownloadsScreenView: - return self.view - - -__all__ = ["DownloadsScreenController"] diff --git a/fastanime/gui/Controller/home_screen.py b/fastanime/gui/Controller/home_screen.py deleted file mode 100644 index 25c06be..0000000 --- a/fastanime/gui/Controller/home_screen.py +++ /dev/null @@ -1,144 +0,0 @@ -from inspect import isgenerator - -from kivy.clock import Clock -from kivy.logger import Logger - -from ...Utility.show_notification import show_notification -from ..Model.home_screen import HomeScreenModel -from ..View.components.media_card.media_card import MediaCardsContainer -from ..View.HomeScreen.home_screen import HomeScreenView - - -# TODO:Move the update home screen to homescreen.py -class HomeScreenController: - """ - The `HomeScreenController` class represents a controller implementation. - Coordinates work of the view with the model. - The controller implements the strategy pattern. The controller connects to - the view to control its actions. - """ - - populate_errors = [] - _discover_anime_list = [] - - def __init__(self, model: HomeScreenModel): - self.model = model # Model.main_screen.MainScreenModel - self.view = HomeScreenView(controller=self, model=self.model) - - self._discover_anime_list = [ - self.highest_scored_anime, - self.popular_anime, - self.favourite_anime, - self.upcoming_anime, - self.recently_updated_anime, - self.trending_anime, - ] - - self.get_more_anime() - - def get_view(self) -> HomeScreenView: - return self.view - - def popular_anime(self): - most_popular_cards_container = MediaCardsContainer() - most_popular_cards_container.list_name = "Most Popular" - most_popular_cards_generator = self.model.get_most_popular_anime() - if isgenerator(most_popular_cards_generator): - for card in most_popular_cards_generator: - card["screen"] = self.view - card["viewclass"] = "MediaCard" - most_popular_cards_container.container.data.append(card) - self.view.main_container.add_widget(most_popular_cards_container) - else: - Logger.error("Home Screen:Failed to load most popular anime") - self.populate_errors.append("Most Popular Anime") - - def favourite_anime(self): - most_favourite_cards_container = MediaCardsContainer() - most_favourite_cards_container.list_name = "Most Favourites" - most_favourite_cards_generator = self.model.get_most_favourite_anime() - if isgenerator(most_favourite_cards_generator): - for card in most_favourite_cards_generator: - card["screen"] = self.view - card["viewclass"] = "MediaCard" - most_favourite_cards_container.container.data.append(card) - self.view.main_container.add_widget(most_favourite_cards_container) - else: - Logger.error("Home Screen:Failed to load most favourite anime") - self.populate_errors.append("Most favourite Anime") - - def trending_anime(self): - trending_cards_container = MediaCardsContainer() - trending_cards_container.list_name = "Trending" - trending_cards_generator = self.model.get_trending_anime() - if isgenerator(trending_cards_generator): - for card in trending_cards_generator: - card["screen"] = self.view - card["viewclass"] = "MediaCard" - trending_cards_container.container.data.append(card) - self.view.main_container.add_widget(trending_cards_container) - else: - Logger.error("Home Screen:Failed to load trending anime") - self.populate_errors.append("trending Anime") - - def highest_scored_anime(self): - most_scored_cards_container = MediaCardsContainer() - most_scored_cards_container.list_name = "Most Scored" - most_scored_cards_generator = self.model.get_most_scored_anime() - if isgenerator(most_scored_cards_generator): - for card in most_scored_cards_generator: - card["screen"] = self.view - card["viewclass"] = "MediaCard" - most_scored_cards_container.container.data.append(card) - self.view.main_container.add_widget(most_scored_cards_container) - else: - Logger.error("Home Screen:Failed to load highest scored anime") - self.populate_errors.append("Most scored Anime") - - def recently_updated_anime(self): - most_recently_updated_cards_container = MediaCardsContainer() - most_recently_updated_cards_container.list_name = "Most Recently Updated" - most_recently_updated_cards_generator = ( - self.model.get_most_recently_updated_anime() - ) - if isgenerator(most_recently_updated_cards_generator): - for card in most_recently_updated_cards_generator: - card["screen"] = self.view - card["viewclass"] = "MediaCard" - most_recently_updated_cards_container.container.data.append(card) - self.view.main_container.add_widget(most_recently_updated_cards_container) - else: - Logger.error("Home Screen:Failed to load recently updated anime") - self.populate_errors.append("Most recently updated Anime") - - def upcoming_anime(self): - upcoming_cards_container = MediaCardsContainer() - upcoming_cards_container.list_name = "Upcoming Anime" - upcoming_cards_generator = self.model.get_upcoming_anime() - if isgenerator(upcoming_cards_generator): - for card in upcoming_cards_generator: - card["screen"] = self.view - card["viewclass"] = "MediaCard" - upcoming_cards_container.container.data.append(card) - self.view.main_container.add_widget(upcoming_cards_container) - else: - Logger.error("Home Screen:Failed to load upcoming anime") - self.populate_errors.append("upcoming Anime") - - def get_more_anime(self): - self.populate_errors = [] - if self._discover_anime_list: - task = self._discover_anime_list.pop() - Clock.schedule_once(lambda _: task()) - else: - show_notification("Home Screen Info", "No more anime to load") - - if self.populate_errors: - show_notification( - "Failed to fetch all home screen data", - f"Theres probably a problem with your internet connection or anilist servers are down.\nFailed include:{', '.join(self.populate_errors)}", - ) - self.populate_errors = [] - - -__all__ = ["HomeScreenController"] diff --git a/fastanime/gui/Controller/my_list_screen.py b/fastanime/gui/Controller/my_list_screen.py deleted file mode 100644 index c0f02eb..0000000 --- a/fastanime/gui/Controller/my_list_screen.py +++ /dev/null @@ -1,50 +0,0 @@ -from inspect import isgenerator -from math import ceil - -from kivy.logger import Logger - -# from kivy.clock import Clock -from kivy.utils import difference - -from ..Model.my_list_screen import MyListScreenModel -from ..Utility import user_data_helper -from ..View.MylistScreen.my_list_screen import MyListScreenView - - -class MyListScreenController: - """ - The `MyListScreenController` class represents a controller implementation. - Coordinates work of the view with the model. - The controller implements the strategy pattern. The controller connects to - the view to control its actions. - """ - - def __init__(self, model: MyListScreenModel): - self.model = model - self.view = MyListScreenView(controller=self, model=self.model) - # if len(self.requested_update_my_list_screen()) > 30: - self.requested_update_my_list_screen() - - def get_view(self) -> MyListScreenView: - return self.view - - def requested_update_my_list_screen(self): - _user_anime_list = user_data_helper.get_user_anime_list() - if animes_to_add := difference( - _user_anime_list, self.model.already_in_user_anime_list - ): - no_of_updates = ceil(len(animes_to_add) / 30) - Logger.info("MyList Screen:Change detected updating screen") - for i in range(no_of_updates): - _animes_to_add = animes_to_add[i * 30 : (i + 1) * 30] - anime_cards = self.model.update_my_anime_list_view(_animes_to_add) - - if isgenerator(anime_cards): - for result_card in anime_cards: - result_card["screen"] = self.view - self.view.update_layout(result_card) - self.model.already_in_user_anime_list = _user_anime_list - return animes_to_add - - -__all__ = ["MyListScreenController"] diff --git a/fastanime/gui/Controller/search_screen.py b/fastanime/gui/Controller/search_screen.py deleted file mode 100644 index 4ef2984..0000000 --- a/fastanime/gui/Controller/search_screen.py +++ /dev/null @@ -1,48 +0,0 @@ -from inspect import isgenerator - -from kivy.clock import Clock -from kivy.logger import Logger - -from ..Model.search_screen import SearchScreenModel -from ..View.SearchScreen.search_screen import SearchScreenView - - -class SearchScreenController: - """The search screen controller""" - - def __init__(self, model: SearchScreenModel): - self.model = model - self.view = SearchScreenView(controller=self, model=self.model) - - def get_view(self) -> SearchScreenView: - return self.view - - def update_trending_anime(self): - """Gets and adds the trending anime to the search screen""" - trending_cards_generator = self.model.get_trending_anime() - if isgenerator(trending_cards_generator): - # self.view.trending_anime_sidebar.data = [] - for card in trending_cards_generator: - card["screen"] = self.view - # card["pos_hint"] = {"center_x": 0.5} - self.view.update_trending_sidebar(card) - else: - Logger.error("Home Screen:Failed to load trending anime") - - def requested_search_for_anime(self, anime_title, **kwargs): - self.view.is_searching = True - search_Results = self.model.search_for_anime(anime_title, **kwargs) - if isgenerator(search_Results): - for result_card in search_Results: - result_card["screen"] = self.view - self.view.update_layout(result_card) - Clock.schedule_once( - lambda _: self.view.update_pagination(self.model.pagination_info) - ) - self.update_trending_anime() - else: - Logger.error(f"Home Screen:Failed to search for {anime_title}") - self.view.is_searching = False - - -__all__ = ["SearchScreenController"] diff --git a/fastanime/gui/Model/__init__.py b/fastanime/gui/Model/__init__.py deleted file mode 100644 index 8b13789..0000000 --- a/fastanime/gui/Model/__init__.py +++ /dev/null @@ -1 +0,0 @@ - diff --git a/fastanime/gui/Model/anime_screen.py b/fastanime/gui/Model/anime_screen.py deleted file mode 100644 index f2ea78b..0000000 --- a/fastanime/gui/Model/anime_screen.py +++ /dev/null @@ -1,115 +0,0 @@ -from fuzzywuzzy import fuzz -from kivy.cache import Cache -from kivy.logger import Logger - -from ...libs.anilist.anilist import AniList -from ...libs.anime_provider.allanime.api import anime_provider -from ...Utility.data import anime_normalizer -from .base_model import BaseScreenModel - - -def anime_title_percentage_match( - possible_user_requested_anime_title: str, title: tuple -) -> float: - """Returns the percentage match between the possible title and user title - - Args: - possible_user_requested_anime_title (str): an Animdl search result title - title (str): the anime title the user wants - - Returns: - int: the percentage match - """ - if normalized_anime_title := anime_normalizer.get( - possible_user_requested_anime_title - ): - possible_user_requested_anime_title = normalized_anime_title - print(locals()) - # compares both the romaji and english names and gets highest Score - percentage_ratio = max( - fuzz.ratio(title[0].lower(), possible_user_requested_anime_title.lower()), - fuzz.ratio(title[1].lower(), possible_user_requested_anime_title.lower()), - ) - print(percentage_ratio) - return percentage_ratio - - -Cache.register("streams.anime", limit=10) - - -class AnimeScreenModel(BaseScreenModel): - """the Anime screen model""" - - data = {} - anime_id = 0 - current_anime_data = None - current_anime_id = "0" - current_title = "" - - def get_anime_data_from_provider(self, anime_title: tuple, is_dub, id=None): - 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 - ) - - 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" - - 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, - ) - return streams - return [] - except Exception as e: - Logger.info("anime_screen error: %s" % e) - return [] - - # should return {type:{provider:streamlink}} - - def get_anime_data(self, id: int): - return AniList.get_anime(id) - - -__all__ = ["AnimeScreenModel"] diff --git a/fastanime/gui/Model/base_model.py b/fastanime/gui/Model/base_model.py deleted file mode 100644 index a018c74..0000000 --- a/fastanime/gui/Model/base_model.py +++ /dev/null @@ -1,36 +0,0 @@ -# The model implements the observer pattern. This means that the class must -# support adding, removing, and alerting observers. In this case, the model is -# completely independent of controllers and views. It is important that all -# registered observers implement a specific method that will be called by the -# model when they are notified (in this case, it is the `model_is_changed` -# method). For this, observers must be descendants of an abstract class, -# inheriting which, the `model_is_changed` method must be overridden. - - -class BaseScreenModel: - """Implements a base class for model modules.""" - - _observers = [] - - def add_observer(self, observer) -> None: - self._observers.append(observer) - - def remove_observer(self, observer) -> None: - self._observers.remove(observer) - - def notify_observers(self, name_screen: str) -> None: - """ - Method that will be called by the observer when the model data changes. - - :param name_screen: - name of the view for which the method should be called - :meth:`model_is_changed`. - """ - - for observer in self._observers: - if observer.name == name_screen: - observer.model_is_changed() - break - - -__all__ = ["BaseScreenModel"] diff --git a/fastanime/gui/Model/download_screen.py b/fastanime/gui/Model/download_screen.py deleted file mode 100644 index d9994fb..0000000 --- a/fastanime/gui/Model/download_screen.py +++ /dev/null @@ -1,24 +0,0 @@ -from .base_model import BaseScreenModel - - -class DownloadsScreenModel(BaseScreenModel): - """ - Handles the download screen logic - """ - - def update_download_progress(self, d): - print( - d["filename"], - d["downloaded_bytes"], - d["total_bytes"], - d.get("total_bytes"), - d["elapsed"], - d["eta"], - d["speed"], - d.get("percent"), - ) - if d["status"] == "finished": - print("Done downloading, now converting ...") - - -__all__ = ["DownloadsScreenModel"] diff --git a/fastanime/gui/Model/home_screen.py b/fastanime/gui/Model/home_screen.py deleted file mode 100644 index a63081e..0000000 --- a/fastanime/gui/Model/home_screen.py +++ /dev/null @@ -1,82 +0,0 @@ -from ...libs.anilist.anilist import AniList -from ..Utility.media_card_loader import media_card_loader -from .base_model import BaseScreenModel - - -class HomeScreenModel(BaseScreenModel): - """The home screen model""" - - def get_trending_anime(self): - success, data = AniList.get_trending() - if success: - - def _data_generator(): - for anime_item in data["data"]["Page"]["media"]: - yield media_card_loader.media_card(anime_item) - - return _data_generator() - else: - return data - - def get_most_favourite_anime(self): - success, data = AniList.get_most_favourite() - if success: - - def _data_generator(): - for anime_item in data["data"]["Page"]["media"]: - yield media_card_loader.media_card(anime_item) - - return _data_generator() - else: - return data - - def get_most_recently_updated_anime(self): - success, data = AniList.get_most_recently_updated() - if success: - - def _data_generator(): - for anime_item in data["data"]["Page"]["media"]: - yield media_card_loader.media_card(anime_item) - - return _data_generator() - else: - return data - - def get_most_popular_anime(self): - success, data = AniList.get_most_popular() - if success: - - def _data_generator(): - for anime_item in data["data"]["Page"]["media"]: - yield media_card_loader.media_card(anime_item) - - return _data_generator() - else: - return data - - def get_most_scored_anime(self): - success, data = AniList.get_most_scored() - if success: - - def _data_generator(): - for anime_item in data["data"]["Page"]["media"]: - yield media_card_loader.media_card(anime_item) - - return _data_generator() - else: - return data - - def get_upcoming_anime(self): - success, data = AniList.get_upcoming_anime(1) - if success: - - def _data_generator(): - for anime_item in data["data"]["Page"]["media"]: - yield media_card_loader.media_card(anime_item) - - return _data_generator() - else: - return data - - -__all__ = ["HomeScreenModel"] diff --git a/fastanime/gui/Model/my_list_screen.py b/fastanime/gui/Model/my_list_screen.py deleted file mode 100644 index d5d9575..0000000 --- a/fastanime/gui/Model/my_list_screen.py +++ /dev/null @@ -1,24 +0,0 @@ -from ...libs.anilist.anilist import AniList -from ...Utility.show_notification import show_notification -from ..Utility.media_card_loader import media_card_loader -from .base_model import BaseScreenModel - - -class MyListScreenModel(BaseScreenModel): - already_in_user_anime_list = [] - - def update_my_anime_list_view(self, not_yet_in_user_anime_list: list): - success, self.data = AniList.search( - id_in=not_yet_in_user_anime_list, sort="SCORE_DESC" - ) - if success: - return self.media_card_generator() - else: - show_notification( - "Failed to update my list screen view", self.data["Error"] - ) - return None - - def media_card_generator(self): - for anime_item in self.data["data"]["Page"]["media"]: - yield media_card_loader.media_card(anime_item) diff --git a/fastanime/gui/Model/search_screen.py b/fastanime/gui/Model/search_screen.py deleted file mode 100644 index 24e6c91..0000000 --- a/fastanime/gui/Model/search_screen.py +++ /dev/null @@ -1,37 +0,0 @@ -from ...libs.anilist.anilist import AniList -from ...Utility.show_notification import show_notification -from ..Utility.media_card_loader import media_card_loader -from .base_model import BaseScreenModel - - -class SearchScreenModel(BaseScreenModel): - data = {} - - def get_trending_anime(self): - success, data = AniList.get_trending() - if success: - - def _data_generator(): - for anime_item in data["data"]["Page"]["media"]: - yield media_card_loader.media_card(anime_item) - - return _data_generator() - else: - return data - - def search_for_anime(self, anime_title, **kwargs): - success, self.data = AniList.search(query=anime_title, **kwargs) - if success: - return self.media_card_generator() - else: - show_notification( - f"Failed to search for {anime_title}", self.data.get("Error") - ) - - def media_card_generator(self): - for anime_item in self.data["data"]["Page"]["media"]: - yield media_card_loader.media_card(anime_item) - self.pagination_info = self.data["data"]["Page"]["pageInfo"] - - -__all__ = ["SearchScreenModel"] diff --git a/fastanime/gui/Utility/media_card_loader.py b/fastanime/gui/Utility/media_card_loader.py deleted file mode 100644 index 90d09f3..0000000 --- a/fastanime/gui/Utility/media_card_loader.py +++ /dev/null @@ -1,137 +0,0 @@ -import yt_dlp -from kivy.cache import Cache -from kivy.logger import Logger - -from ...libs.anilist.anilist_data_schema import AnilistBaseMediaDataSchema -from ...Utility import anilist_data_helper -from . import user_data_helper - -Cache.register("trailer_urls.anime", timeout=360) - - -class MediaCardDataLoader(object): - """this class loads an anime media card and gets the trailer url from pytube""" - - def media_card( - self, - anime_item: AnilistBaseMediaDataSchema, - ): - media_card_data = {} - media_card_data["viewclass"] = "MediaCard" - media_card_data["anime_id"] = anime_id = anime_item["id"] - - # TODO: ADD language preference - if anime_item["title"].get("romaji"): - media_card_data["title"] = anime_item["title"]["romaji"] - media_card_data["_title"] = ( - anime_item["title"]["romaji"], - str(anime_item["title"]["english"]), - ) - else: - media_card_data["title"] = anime_item["title"]["english"] - media_card_data["_title"] = ( - anime_item["title"]["english"], - str(anime_item["title"]["romaji"]), - ) - - media_card_data["cover_image_url"] = anime_item["coverImage"]["medium"] - - media_card_data["popularity"] = str(anime_item["popularity"]) - - media_card_data["favourites"] = str(anime_item["favourites"]) - - media_card_data["episodes"] = str(anime_item["episodes"]) - - if anime_item.get("description"): - media_card_data["description"] = anime_item["description"] - else: - media_card_data["description"] = "None" - - # TODO: switch to season and year - # - media_card_data["first_aired_on"] = ( - f'{anilist_data_helper.format_anilist_date_object(anime_item["startDate"])}' - ) - - media_card_data["studios"] = anilist_data_helper.format_list_data_with_comma( - [ - studio["name"] - for studio in anime_item["studios"]["nodes"] - if studio["isAnimationStudio"] - ] - ) - - media_card_data["producers"] = anilist_data_helper.format_list_data_with_comma( - [ - studio["name"] - for studio in anime_item["studios"]["nodes"] - if not studio["isAnimationStudio"] - ] - ) - - media_card_data["next_airing_episode"] = "{}".format( - anilist_data_helper.extract_next_airing_episode( - anime_item["nextAiringEpisode"] - ) - ) - if anime_item.get("tags"): - media_card_data["tags"] = anilist_data_helper.format_list_data_with_comma( - [tag["name"] for tag in anime_item["tags"]] - ) - - media_card_data["media_status"] = anime_item["status"] - - if anime_item.get("genres"): - media_card_data["genres"] = anilist_data_helper.format_list_data_with_comma( - anime_item["genres"] - ) - - if anime_id in user_data_helper.get_user_anime_list(): - media_card_data["is_in_my_list"] = True - else: - media_card_data["is_in_my_list"] = False - - if anime_item["averageScore"]: - stars = int(anime_item["averageScore"] / 100 * 6) - media_card_data["stars"] = [0, 0, 0, 0, 0, 0] - if stars: - for i in range(stars): - media_card_data["stars"][i] = 1 - - if trailer := anime_item.get("trailer"): - trailer_url = "https://youtube.com/watch?v=" + trailer["id"] - media_card_data["_trailer_url"] = trailer_url - else: - media_card_data["_trailer_url"] = "" - return media_card_data - - def _get_stream_link(self, video_url): - ydl_opts = { - "format": "best", # You can specify the format you want here - "quiet": False, # Suppress yt-dlp output - } - - with yt_dlp.YoutubeDL(ydl_opts) as ydl: - info_dict = ydl.extract_info(video_url, download=False) - if info_dict: - video_url = info_dict.get("url", "") - else: - return "" - - return video_url - - def get_trailer_from_pytube(self, trailer_url, anime): - if trailer := Cache.get("trailer_urls.anime", trailer_url): - return trailer - try: - trailer = self._get_stream_link(trailer_url) - Logger.info(f"Pytube Success:For {anime}") - if trailer: - Cache.append("trailer_urls.anime", trailer_url, trailer) - return trailer - except Exception as e: - Logger.error(f"Pytube Failure:For {anime} reason: {e}") - return "" - - -media_card_loader = MediaCardDataLoader() diff --git a/fastanime/gui/Utility/user_data_helper.py b/fastanime/gui/Utility/user_data_helper.py deleted file mode 100644 index bb2ddef..0000000 --- a/fastanime/gui/Utility/user_data_helper.py +++ /dev/null @@ -1,34 +0,0 @@ -""" -Contains Helper functions to read and write the user data files -""" - -from datetime import date, datetime - -from kivy.logger import Logger -from kivy.storage.jsonstore import JsonStore - -from ... import USER_DATA_PATH - -today = date.today() -now = datetime.now() - -user_data = JsonStore(USER_DATA_PATH) - - -# Get the user data -def get_user_anime_list() -> list: - try: - return user_data.get("user_anime_list")[ - "user_anime_list" - ] # returns a list of anime ids - except Exception as e: - Logger.warning(f"User Data:Read failure:{e}") - return [] - - -def update_user_anime_list(updated_list: list): - try: - updated_list_ = list(set(updated_list)) - user_data.put("user_anime_list", user_anime_list=updated_list_) - except Exception as e: - Logger.warning(f"User Data:Update failure:{e}") diff --git a/fastanime/gui/View/AnimeScreen/__init__.py b/fastanime/gui/View/AnimeScreen/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/fastanime/gui/View/AnimeScreen/anime_screen.kv b/fastanime/gui/View/AnimeScreen/anime_screen.kv deleted file mode 100644 index 8ca9014..0000000 --- a/fastanime/gui/View/AnimeScreen/anime_screen.kv +++ /dev/null @@ -1,110 +0,0 @@ -: - adaptive_height:True - orientation:'vertical' - -: - adaptive_height:True - bold:True - -: - pos_hint:{"center_y":0.5,"center_x":0.5} - on_press:root.change_episode_callback(root.text) - radius: 10 - MDButtonText: - text:root.text - - - -: - md_bg_color: self.theme_cls.backgroundColor - episodes_container:episodes_container - video_player:video_player - is_dub:is_dub - MDBoxLayout: - padding:"10dp" - orientation: 'vertical' - MDBoxLayout: - adaptive_height:True - MDIconButton: - icon:"arrow-left" - on_press:root.manager_screens.current = root.caller_screen_name - - MDBoxLayout: - VideoPlayer: - id:video_player - source:root.current_link - AnimeBoxLayout: - padding: "20dp" - radius:5 - spacing:"10dp" - md_bg_color: self.theme_cls.surfaceContainerLowColor - AnimeBoxLayout: - orientation:'horizontal' - MDIconButton: - icon:"skip-previous" - on_press:root.previous_episode() - MDIconButton: - icon:"skip-next" - on_press: root.next_episode() - MDIconButton: - icon:"download" - on_press: - if root.current_link: app.download_anime_video(root.current_link,(root.current_title[0],root.current_episode)) - MDButton: - on_press: - if root.current_link: app.play_on_mpv(root.current_link) - MDButtonText: - text:"Play on MPV" - AnimeLabel: - text:"Dub: " - padding: "10dp" - adaptive_width:True - MDSwitch: - id:is_dub - AnimeBoxLayout: - AnimeLabel: - text:"servers: " - MDSegmentedButton: - id:pl - multiselect:False - MDSegmentedButtonItem: - on_active: - pl.selected_segments = [self] - root.update_current_video_stream("gogoanime") - MDSegmentButtonLabel: - text:"GoGoAnime" - MDSegmentedButtonItem: - id:dropbox - on_active: - root.update_current_video_stream("dropbox") - pl.selected_segments = [self] - MDSegmentButtonLabel: - text:"DropBox" - MDSegmentedButtonItem: - on_active: - root.update_current_video_stream("sharepoint") - pl.selected_segments = [self] - MDSegmentButtonLabel: - text:"Share Point" - MDSegmentedButtonItem: - on_active: - root.update_current_video_stream("wetransfer") - pl.selected_segments = [self] - MDSegmentButtonLabel: - text:"weTransfer" - MDDivider: - - MDRecycleView: - id: episodes_container - size_hint_y:None - height:"50dp" - key_viewclass:"viewclass" - RecycleBoxLayout: - size_hint: None,1 - key_size:"width" - spacing:"10dp" - width:self.minimum_width - default_size_hint:0,0 - default_size:30,30 - default_pos_hint:{"center_y":0.5,"center_x":0.5} - diff --git a/fastanime/gui/View/AnimeScreen/anime_screen.py b/fastanime/gui/View/AnimeScreen/anime_screen.py deleted file mode 100644 index 1b4f856..0000000 --- a/fastanime/gui/View/AnimeScreen/anime_screen.py +++ /dev/null @@ -1,83 +0,0 @@ -from kivy.properties import ListProperty, ObjectProperty, StringProperty -from kivy.uix.widget import Factory -from kivymd.uix.button import MDButton - -from ...View.base_screen import BaseScreenView - - -class EpisodeButton(MDButton): - text = StringProperty() - change_episode_callback = ObjectProperty() - - -Factory.register("EpisodeButton", cls=EpisodeButton) - - -class AnimeScreenView(BaseScreenView): - """The anime screen view""" - - current_link = StringProperty() - current_links = ListProperty([]) - current_anime_data = ObjectProperty() - caller_screen_name = ObjectProperty() - current_title = () - episodes_container = ObjectProperty() - total_episodes = 0 - current_episode = 1 - video_player = ObjectProperty() - current_server = "dropbox" - is_dub = ObjectProperty() - - def __init__(self, **kwargs): - super().__init__(**kwargs) - # self.update_episodes(100) - - def update_episodes(self, episodes_list): - self.episodes_container.data = [] - self.total_episodes = len(episodes_list) - for episode in episodes_list: - self.episodes_container.data.append( - { - "viewclass": "EpisodeButton", - "text": str(episode), - "change_episode_callback": lambda x=episode: self.update_current_episode( - x - ), - } - ) - - def next_episode(self): - next_episode = self.current_episode + 1 - if next_episode <= self.total_episodes: - self.update_current_episode(str(next_episode)) - - def previous_episode(self): - previous_episode = self.current_episode - 1 - if previous_episode > 0: - self.update_current_episode(str(previous_episode)) - - def on_current_anime_data(self, instance, value): - data = value["show"] - self.update_episodes(data["availableEpisodesDetail"]["sub"][::-1]) - self.current_episode = int("1") - self.update_current_video_stream(self.current_server) - self.video_player.state = "play" - - def update_current_episode(self, episode): - self.current_episode = int(episode) - self.controller.fetch_streams(self.current_title, self.is_dub.active, episode) - self.update_current_video_stream(self.current_server) - self.video_player.state = "play" - - def update_current_video_stream(self, server, is_dub=False): - for link in self.current_links: - if stream_link := link.get(server): - self.current_server = server - self.current_link = stream_link[0] - break - - def add_to_user_anime_list(self, *args): - self.app.add_anime_to_user_anime_list(self.model.anime_id) - - -__all__ = ["AnimeScreenView"] diff --git a/fastanime/gui/View/DownloadsScreen/__init__.py b/fastanime/gui/View/DownloadsScreen/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/fastanime/gui/View/DownloadsScreen/components/__init__.py b/fastanime/gui/View/DownloadsScreen/components/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/fastanime/gui/View/DownloadsScreen/components/status_bar.kv b/fastanime/gui/View/DownloadsScreen/components/status_bar.kv deleted file mode 100644 index e69de29..0000000 diff --git a/fastanime/gui/View/DownloadsScreen/components/task_card.kv b/fastanime/gui/View/DownloadsScreen/components/task_card.kv deleted file mode 100644 index 45814d0..0000000 --- a/fastanime/gui/View/DownloadsScreen/components/task_card.kv +++ /dev/null @@ -1,23 +0,0 @@ -#:import color_text fastanime.Utility.kivy_markup_helper.color_text - -: - adaptive_height:True - max_lines:0 - shorten:False - markup:True - font_style: "Label" - role: "large" - bold:True - - -: - adaptive_height:True - radius:8 - padding:"20dp" - md_bg_color:self.theme_cls.surfaceContainerHighColor - - TaskText: - size_hint_x:.8 - text:"{} Episode: {}".format(root.file[0],root.file[1]) - - diff --git a/fastanime/gui/View/DownloadsScreen/components/task_card.py b/fastanime/gui/View/DownloadsScreen/components/task_card.py deleted file mode 100644 index 89c0a77..0000000 --- a/fastanime/gui/View/DownloadsScreen/components/task_card.py +++ /dev/null @@ -1,13 +0,0 @@ -from kivy.properties import ListProperty, StringProperty -from kivymd.uix.boxlayout import MDBoxLayout - - -class TaskCard(MDBoxLayout): - file = ListProperty(("", "")) - eta = StringProperty() - - def __init__(self, file: str, *args, **kwargs): - super().__init__(*args, **kwargs) - self.file = file - # self.eta = eta - # diff --git a/fastanime/gui/View/DownloadsScreen/download_screen.kv b/fastanime/gui/View/DownloadsScreen/download_screen.kv deleted file mode 100644 index fe881d9..0000000 --- a/fastanime/gui/View/DownloadsScreen/download_screen.kv +++ /dev/null @@ -1,58 +0,0 @@ -#:import get_color_from_hex kivy.utils.get_color_from_hex -#:import StringProperty kivy.properties.StringProperty - -: - adaptive_height:True - max_lines:0 - shorten:False - markup:True - font_style: "Label" - role: "small" - bold:True - - md_bg_color: self.theme_cls.backgroundColor - main_container:main_container - download_progress_label:download_progress_label - progress_bar:progress_bar - MDBoxLayout: - NavRail: - screen:root - MDAnchorLayout: - anchor_y: 'top' - MDBoxLayout: - orientation: 'vertical' - SearchBar: - MDScrollView: - size_hint:.95,1 - MDBoxLayout: - id:main_container - orientation:"vertical" - padding:"40dp" - pos_hint:{"center_x":.5} - spacing:"10dp" - adaptive_height:True - HeaderLabel: - text:"Download Tasks" - halign:"left" - MDIcon: - padding:"10dp" - pos_hint:{"center_y":.5} - icon:"clock" - MDBoxLayout: - size_hint_y:None - height:"40dp" - spacing:"10dp" - padding:"10dp" - md_bg_color:self.theme_cls.secondaryContainerColor - DownloadsScreenLabel: - id:download_progress_label - size_hint_x: .8 - text:"Try Downloading sth :)" - pos_hint: {'center_y': .5} - MDLinearProgressIndicator: - id: progress_bar - size_hint_x: .2 - size_hint_y:None - height:"10dp" - type: "determinate" - pos_hint: {'center_y': .5} diff --git a/fastanime/gui/View/DownloadsScreen/download_screen.py b/fastanime/gui/View/DownloadsScreen/download_screen.py deleted file mode 100644 index 72675ef..0000000 --- a/fastanime/gui/View/DownloadsScreen/download_screen.py +++ /dev/null @@ -1,45 +0,0 @@ -from kivy.clock import Clock -from kivy.properties import ObjectProperty -from kivy.utils import format_bytes_to_human - -from ...View.base_screen import BaseScreenView -from .components.task_card import TaskCard - - -class DownloadsScreenView(BaseScreenView): - main_container = ObjectProperty() - progress_bar = ObjectProperty() - download_progress_label = ObjectProperty() - - def new_download_task(self, filename): - Clock.schedule_once( - lambda _: self.main_container.add_widget(TaskCard(filename)) - ) - - def on_episode_download_progress(self, data): - percentage_completion = round( - (data.get("downloaded_bytes", 0) / data.get("total_bytes", 0)) * 100 - ) - speed = format_bytes_to_human(data.get("speed", 0)) if data.get("speed") else 0 - progress_text = f"Downloading: {data.get('filename', 'unknown')} ({format_bytes_to_human(data.get('downloaded_bytes',0)) if data.get('downloaded_bytes') else 0}/{format_bytes_to_human(data.get('total_bytes',0)) if data.get('total_bytes') else 0})\n Elapsed: {round(data.get('elapsed',0)) if data.get('elapsed') else 0}s ETA: {data.get('eta',0) if data.get('eta') else 0}s Speed: {speed}/s" - - self.progress_bar.value = max(min(percentage_completion, 100), 0) - self.download_progress_label.text = progress_text - - def update_layout(self, widget): - self.user_anime_list_container.add_widget(widget) - - # - # d["filename"], - # d["downloaded_bytes"], - # d["total_bytes"], - # d.get("total_bytes"), - # d["elapsed"], - # d["eta"], - # d["speed"], - # d.get("percent"), - # ) - # - - -__all__ = ["DownloadsScreenView"] diff --git a/fastanime/gui/View/HomeScreen/__init__.py b/fastanime/gui/View/HomeScreen/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/fastanime/gui/View/HomeScreen/components/__init__.py b/fastanime/gui/View/HomeScreen/components/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/fastanime/gui/View/HomeScreen/home_screen.kv b/fastanime/gui/View/HomeScreen/home_screen.kv deleted file mode 100644 index 9676b4b..0000000 --- a/fastanime/gui/View/HomeScreen/home_screen.kv +++ /dev/null @@ -1,29 +0,0 @@ - - md_bg_color: self.theme_cls.backgroundColor - main_container:main_container - MDBoxLayout: - NavRail: - screen:root - MDAnchorLayout: - anchor_y: 'top' - padding:"10dp" - MDBoxLayout: - orientation: 'vertical' - id:p - SearchBar: - MDScrollView: - size_hint:1,1 - MDBoxLayout: - id:main_container - padding:"50dp","5dp","50dp","150dp" - spacing:"10dp" - orientation: 'vertical' - size_hint_y:None - height:self.minimum_height - MDButton: - on_press: - if root.controller: root.controller.get_more_anime() - MDButtonText: - text:"Load More Anime" - - diff --git a/fastanime/gui/View/HomeScreen/home_screen.py b/fastanime/gui/View/HomeScreen/home_screen.py deleted file mode 100644 index 0b98702..0000000 --- a/fastanime/gui/View/HomeScreen/home_screen.py +++ /dev/null @@ -1,10 +0,0 @@ -from kivy.properties import ObjectProperty - -from ...View.base_screen import BaseScreenView - - -class HomeScreenView(BaseScreenView): - main_container = ObjectProperty() - - -__all__ = ["HomeScreenView"] diff --git a/fastanime/gui/View/MylistScreen/__init__.py b/fastanime/gui/View/MylistScreen/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/fastanime/gui/View/MylistScreen/my_list_screen.kv b/fastanime/gui/View/MylistScreen/my_list_screen.kv deleted file mode 100644 index 3c23ab3..0000000 --- a/fastanime/gui/View/MylistScreen/my_list_screen.kv +++ /dev/null @@ -1,32 +0,0 @@ - - md_bg_color: self.theme_cls.backgroundColor - user_anime_list_container:user_anime_list_container - MDBoxLayout: - size_hint:1,1 - NavRail: - screen:root - MDAnchorLayout: - anchor_y: 'top' - padding:"10dp" - size_hint:1,1 - MDBoxLayout: - spacing:"40dp" - orientation: 'vertical' - size_hint:.95,1 - SearchBar: - MDRecycleView: - pos_hint:{"center_x":.5} - size_hint:1,1 - id:user_anime_list_container - key_viewclass:"viewclass" - MDRecycleGridLayout: - pos_hint: {'center_x': 0.5} - spacing: '40dp' - padding: "25dp","50dp","75dp","200dp" - default_size_hint:None,None - default_size:dp(100),dp(150) - cols:3 if root.width <= 1100 else 5 - size_hint_y:None - height:max(self.parent.parent.height,self.minimum_height) - - diff --git a/fastanime/gui/View/MylistScreen/my_list_screen.py b/fastanime/gui/View/MylistScreen/my_list_screen.py deleted file mode 100644 index 598becb..0000000 --- a/fastanime/gui/View/MylistScreen/my_list_screen.py +++ /dev/null @@ -1,21 +0,0 @@ -from kivy.clock import Clock -from kivy.properties import ObjectProperty - -from ...View.base_screen import BaseScreenView - - -class MyListScreenView(BaseScreenView): - user_anime_list_container = ObjectProperty() - - def model_is_changed(self) -> None: - """ - Called whenever any change has occurred in the data model. - The view in this method tracks these changes and updates the UI - according to these changes. - """ - - def on_enter(self): - Clock.schedule_once(lambda _: self.controller.requested_update_my_list_screen()) - - def update_layout(self, widget): - self.user_anime_list_container.data.append(widget) diff --git a/fastanime/gui/View/SearchScreen/__init__.py b/fastanime/gui/View/SearchScreen/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/fastanime/gui/View/SearchScreen/components/__init__.py b/fastanime/gui/View/SearchScreen/components/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/fastanime/gui/View/SearchScreen/components/filters.kv b/fastanime/gui/View/SearchScreen/components/filters.kv deleted file mode 100644 index 43b3e52..0000000 --- a/fastanime/gui/View/SearchScreen/components/filters.kv +++ /dev/null @@ -1,27 +0,0 @@ -: - MDDropDownItemText: - text: root.text - -: - adaptive_width:True - -: - adaptive_height:True - spacing:"10dp" - size_hint_x:.95 - pos_hint:{"center_x":.5} - padding:"10dp" - md_bg_color:self.theme_cls.surfaceContainerLowColor - - FilterLabel: - text:"Sort By" - FilterDropDown: - id:sort_filter - text:root.filters["sort"] - on_release: root.open_filter_menu(self,"sort") - FilterLabel: - text:"Status" - FilterDropDown: - id:status_filter - text:root.filters["status"] - on_release: root.open_filter_menu(self,"status") diff --git a/fastanime/gui/View/SearchScreen/components/filters.py b/fastanime/gui/View/SearchScreen/components/filters.py deleted file mode 100644 index 5fff5a3..0000000 --- a/fastanime/gui/View/SearchScreen/components/filters.py +++ /dev/null @@ -1,82 +0,0 @@ -from kivy.properties import DictProperty, StringProperty -from kivymd.uix.boxlayout import MDBoxLayout -from kivymd.uix.dropdownitem import MDDropDownItem -from kivymd.uix.menu import MDDropdownMenu - - -class FilterDropDown(MDDropDownItem): - text: str = StringProperty() - - -class Filters(MDBoxLayout): - filters: dict = DictProperty({"sort": "SEARCH_MATCH", "status": "FINISHED"}) - - def open_filter_menu(self, menu_item, filter_name): - items = [] - match filter_name: - case "sort": - items = [ - "ID", - "ID_DESC", - "TITLE_ROMANJI", - "TITLE_ROMANJI_DESC", - "TITLE_ENGLISH", - "TITLE_ENGLISH_DESC", - "TITLE_NATIVE", - "TITLE_NATIVE_DESC", - "TYPE", - "TYPE_DESC", - "FORMAT", - "FORMAT_DESC", - "START_DATE", - "START_DATE_DESC", - "END_DATE", - "END_DATE_DESC", - "SCORE", - "SCORE_DESC", - "TRENDING", - "TRENDING_DESC", - "EPISODES", - "EPISODES_DESC", - "DURATION", - "DURATION_DESC", - "STATUS", - "STATUS_DESC", - "UPDATED_AT", - "UPDATED_AT_DESC", - "SEARCH_MATCH", - "POPULARITY", - "POPULARITY_DESC", - "FAVOURITES", - "FAVOURITES_DESC", - ] - case "status": - items = [ - "FINISHED", - "RELEASING", - "NOT_YET_RELEASED", - "CANCELLED", - "HIATUS", - ] - case _: - items = [] - if items: - menu_items = [ - { - "text": f"{item}", - "on_release": lambda filter_value=f"{item}": self.filter_menu_callback( - filter_name, filter_value - ), - } - for item in items - ] - MDDropdownMenu(caller=menu_item, items=menu_items).open() - - def filter_menu_callback(self, filter_name, filter_value): - match filter_name: - case "sort": - self.ids.sort_filter.text = filter_value - self.filters["sort"] = filter_value - case "status": - self.ids.status_filter.text = filter_value - self.filters["status"] = filter_value diff --git a/fastanime/gui/View/SearchScreen/components/pagination.kv b/fastanime/gui/View/SearchScreen/components/pagination.kv deleted file mode 100644 index ecc47fd..0000000 --- a/fastanime/gui/View/SearchScreen/components/pagination.kv +++ /dev/null @@ -1,21 +0,0 @@ -: - max_lines:0 - shorten:False - adaptive_height:True - font_style: "Label" - pos_hint:{"center_y":.5} - halign:"center" - role: "medium" - -: - md_bg_color:self.theme_cls.surfaceContainerLowColor - radius:8 - adaptive_height:True - MDIconButton: - icon:"arrow-left" - on_release:root.search_view.previous_page() - PaginationLabel: - text:"Page {} of {}".format(root.current_page,root.total_pages) - MDIconButton: - icon:"arrow-right" - on_release:root.search_view.next_page() \ No newline at end of file diff --git a/fastanime/gui/View/SearchScreen/components/pagination.py b/fastanime/gui/View/SearchScreen/components/pagination.py deleted file mode 100644 index 7b6a6bc..0000000 --- a/fastanime/gui/View/SearchScreen/components/pagination.py +++ /dev/null @@ -1,8 +0,0 @@ -from kivy.properties import NumericProperty, ObjectProperty -from kivymd.uix.boxlayout import MDBoxLayout - - -class SearchResultsPagination(MDBoxLayout): - current_page = NumericProperty() - total_pages = NumericProperty() - search_view = ObjectProperty() diff --git a/fastanime/gui/View/SearchScreen/components/trending_sidebar.kv b/fastanime/gui/View/SearchScreen/components/trending_sidebar.kv deleted file mode 100644 index 1dbb321..0000000 --- a/fastanime/gui/View/SearchScreen/components/trending_sidebar.kv +++ /dev/null @@ -1,23 +0,0 @@ -: - md_bg_color:self.theme_cls.surfaceContainerLowColor - padding:"25dp","25dp","25dp","200dp" - pos_hint: {'center_x': 0.5} - key_viewclass:"viewclass" - size_hint: None,1 - width:"250dp" - pos_hint: {'center_x':.5} - RecycleBoxLayout: - orientation: 'vertical' - key_size:"height" - key_viewclass:"viewclass" - pos_hint: {'center_x': 0.8} - size_hint:None,None - default_size_hint:None, None - default_pos_hint:{"center_x":0.8} - default_size:dp(150),dp(100) - width:"250dp" - spacing:"10dp" - height:max(self.minimum_height,500) -#padding:"0dp","10dp","100dp","10dp" - # height:max(self.parent.parent.height,self.minimum_height+100) - diff --git a/fastanime/gui/View/SearchScreen/components/trending_sidebar.py b/fastanime/gui/View/SearchScreen/components/trending_sidebar.py deleted file mode 100644 index f5adfd3..0000000 --- a/fastanime/gui/View/SearchScreen/components/trending_sidebar.py +++ /dev/null @@ -1,5 +0,0 @@ -from kivymd.uix.recycleview import MDRecycleView - - -class TrendingAnimeSideBar(MDRecycleView): - pass diff --git a/fastanime/gui/View/SearchScreen/search_screen.kv b/fastanime/gui/View/SearchScreen/search_screen.kv deleted file mode 100644 index c0c3762..0000000 --- a/fastanime/gui/View/SearchScreen/search_screen.kv +++ /dev/null @@ -1,76 +0,0 @@ - - md_bg_color: self.theme_cls.backgroundColor - search_results_container:search_results_container - trending_anime_sidebar:trending_anime_sidebar - search_results_pagination:search_results_pagination - filters:filters - MDBoxLayout: - size_hint:1,1 - NavRail: - screen:root - MDAnchorLayout: - anchor_y: 'top' - padding:"10dp" - size_hint:1,1 - - MDBoxLayout: - orientation: 'vertical' - size_hint:1,1 - SearchBar: - MDBoxLayout: - spacing:"20dp" - padding:"75dp","10dp","100dp","0dp" - MDBoxLayout: - orientation: 'vertical' - size_hint:1,1 - Filters: - id:filters - MDBoxLayout: - spacing:"20dp" - MDScrollView: - size_hint:1,1 - MDBoxLayout: - orientation: 'vertical' - size_hint_y:None - height:max(self.parent.parent.height,self.minimum_height) - MDRecycleView: - id:search_results_container - key_viewclass:"viewclass" - MDRecycleGridLayout: - pos_hint: {'center_x': 0.5} - spacing: '40dp' - padding: "25dp","50dp","75dp","200dp" - default_size_hint:None,None - default_size:dp(100),dp(150) - cols:3 if root.width <= 1100 else 5 - size_hint_y:None - height:max(self.parent.parent.height,self.minimum_height) - SearchResultsPagination: - id:search_results_pagination - search_view:root - - MDBoxLayout: - orientation:"vertical" - size_hint_y:1 - size_hint_x:None - width: dp(250) - HeaderLabel: - text:"Trending" - halign:"center" - #TrendingAnimeSideBar: - # id:trending_anime_sidebar - - MDRecycleView: - id:trending_anime_sidebar - key_viewclass:"viewclass" - MDRecycleGridLayout: - md_bg_color:self.theme_cls.surfaceContainerLowColor - pos_hint: {'center_x': 0.5} - spacing: '40dp' - padding: "75dp","25dp","25dp","200dp" - default_size_hint:None,None - default_pos_hint:{"center_x":0.5,"center_y":0.5} - default_size:dp(100),dp(150) - cols:1 - size_hint_y:None - height:max(self.parent.parent.height,self.minimum_height) diff --git a/fastanime/gui/View/SearchScreen/search_screen.py b/fastanime/gui/View/SearchScreen/search_screen.py deleted file mode 100644 index 86d456d..0000000 --- a/fastanime/gui/View/SearchScreen/search_screen.py +++ /dev/null @@ -1,72 +0,0 @@ -from kivy.clock import Clock -from kivy.properties import ObjectProperty, StringProperty - -from ...View.base_screen import BaseScreenView -from .components.filters import Filters -from .components.pagination import SearchResultsPagination -from .components.trending_sidebar import TrendingAnimeSideBar - - -class SearchScreenView(BaseScreenView): - trending_anime_sidebar: TrendingAnimeSideBar = ObjectProperty() - search_results_pagination: SearchResultsPagination = ObjectProperty() - filters: Filters = ObjectProperty() - - search_results_container = ObjectProperty() - search_term: str = StringProperty() - is_searching = False - has_next_page = False - current_page = 0 - total_pages = 0 - - def handle_search_for_anime(self, search_widget=None, page=None): - if search_widget: - search_term = search_widget.text - elif page: - search_term = self.search_term - else: - return - - if search_term and not (self.is_searching): - self.search_term = search_term - self.search_results_container.data = [] - if filters := self.filters.filters: - Clock.schedule_once( - lambda _: self.controller.requested_search_for_anime( - search_term, **filters, page=page - ) - ) - else: - Clock.schedule_once( - lambda _: self.controller.requested_search_for_anime( - search_term, page=page - ) - ) - - def update_layout(self, widget): - self.search_results_container.data.append(widget) - - def update_pagination(self, pagination_info): - self.search_results_pagination.current_page = self.current_page = ( - pagination_info["currentPage"] - ) - self.search_results_pagination.total_pages = self.total_pages = max( - int(pagination_info["total"] / 30), 1 - ) - self.has_next_page = pagination_info["hasNextPage"] - - def next_page(self): - if self.has_next_page: - page = self.current_page + 1 - self.handle_search_for_anime(page=page) - - def previous_page(self): - if self.current_page > 1: - page = self.current_page - 1 - self.handle_search_for_anime(page=page) - - def update_trending_sidebar(self, trending_anime): - self.trending_anime_sidebar.data.append(trending_anime) - - -__all__ = ["SearchScreenView"] diff --git a/fastanime/gui/View/__init__.py b/fastanime/gui/View/__init__.py deleted file mode 100644 index 8b13789..0000000 --- a/fastanime/gui/View/__init__.py +++ /dev/null @@ -1 +0,0 @@ - diff --git a/fastanime/gui/View/base_screen.py b/fastanime/gui/View/base_screen.py deleted file mode 100644 index f2d9737..0000000 --- a/fastanime/gui/View/base_screen.py +++ /dev/null @@ -1,76 +0,0 @@ -from kivy.properties import ObjectProperty, StringProperty -from kivymd.app import MDApp -from kivymd.uix.boxlayout import MDBoxLayout -from kivymd.uix.button import MDIconButton -from kivymd.uix.navigationrail import MDNavigationRail, MDNavigationRailItem -from kivymd.uix.screen import MDScreen -from kivymd.uix.tooltip import MDTooltip - -from ...Utility.observer import Observer - - -class NavRail(MDNavigationRail): - screen = ObjectProperty() - - -class SearchBar(MDBoxLayout): - screen = ObjectProperty() - - -class Tooltip(MDTooltip): - pass - - -class TooltipMDIconButton(Tooltip, MDIconButton): - tooltip_text = StringProperty() - - -class CommonNavigationRailItem(MDNavigationRailItem): - icon = StringProperty() - text = StringProperty() - - -class HeaderLabel(MDBoxLayout): - text = StringProperty() - halign = StringProperty("left") - - -class BaseScreenView(MDScreen, Observer): - """ - A base class that implements a visual representation of the model data. - The view class must be inherited from this class. - """ - - controller = ObjectProperty() - """ - Controller object - :class:`~Controller.controller_screen.ClassScreenControler`. - - :attr:`controller` is an :class:`~kivy.properties.ObjectProperty` - and defaults to `None`. - """ - - model = ObjectProperty() - """ - Model object - :class:`~Model.model_screen.ClassScreenModel`. - - :attr:`model` is an :class:`~kivy.properties.ObjectProperty` - and defaults to `None`. - """ - - manager_screens = ObjectProperty() - """ - Screen manager object - :class:`~kivymd.uix.screenmanager.MDScreenManager`. - - :attr:`manager_screens` is an :class:`~kivy.properties.ObjectProperty` - and defaults to `None`. - """ - - def __init__(self, **kw): - super().__init__(**kw) - # Often you need to get access to the application object from the view - # class. You can do this using this attribute. - from ...gui import FastAnime - - self.app: FastAnime = MDApp.get_running_app() # type: ignore - # Adding a view class as observer. - self.model.add_observer(self) diff --git a/fastanime/gui/View/components/__init__.py b/fastanime/gui/View/components/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/fastanime/gui/View/components/animdl_dialog/animdl_dialog.kv b/fastanime/gui/View/components/animdl_dialog/animdl_dialog.kv deleted file mode 100644 index e69de29..0000000 diff --git a/fastanime/gui/View/components/animdl_dialog/animdl_dialog.py b/fastanime/gui/View/components/animdl_dialog/animdl_dialog.py deleted file mode 100644 index a20400f..0000000 --- a/fastanime/gui/View/components/animdl_dialog/animdl_dialog.py +++ /dev/null @@ -1,5 +0,0 @@ -from kivy.uix.modalview import ModalView - - -class AnimdlDialogPopup(ModalView): - pass diff --git a/fastanime/gui/View/components/general.kv b/fastanime/gui/View/components/general.kv deleted file mode 100644 index ad75330..0000000 --- a/fastanime/gui/View/components/general.kv +++ /dev/null @@ -1,19 +0,0 @@ -: - allow_copy:True - allow_selection:True - -: - adaptive_height:True - md_bg_color:self.theme_cls.secondaryContainerColor - MDLabel: - text:root.text - adaptive_height:True - halign:root.halign - max_lines:0 - shorten:False - bold:True - font_style: "Label" - role: "large" - padding:"10dp" - - diff --git a/fastanime/gui/View/components/media_card/__init__.py b/fastanime/gui/View/components/media_card/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/fastanime/gui/View/components/media_card/components/__init__.py b/fastanime/gui/View/components/media_card/components/__init__.py deleted file mode 100644 index e69de29..0000000 diff --git a/fastanime/gui/View/components/media_card/components/media_cards_container.kv b/fastanime/gui/View/components/media_card/components/media_cards_container.kv deleted file mode 100644 index dec8f95..0000000 --- a/fastanime/gui/View/components/media_card/components/media_cards_container.kv +++ /dev/null @@ -1,22 +0,0 @@ - - size_hint:1,None - height: dp(250) - container:container - orientation: 'vertical' - padding:"10dp" - spacing:"5dp" - MDLabel: - bold:True - adaptive_height:True - text:root.list_name - MDRecycleView: - id:container - key_viewclass:"viewclass" - key_size:"width" - RecycleBoxLayout: - size_hint:None,1 - width:self.minimum_width - default_size_hint:None, None - default_size:dp(150),dp(100) - spacing:"10dp" - padding:"0dp","10dp","100dp","10dp" diff --git a/fastanime/gui/View/components/media_card/components/media_player.py b/fastanime/gui/View/components/media_card/components/media_player.py deleted file mode 100644 index f737cc1..0000000 --- a/fastanime/gui/View/components/media_card/components/media_player.py +++ /dev/null @@ -1,13 +0,0 @@ -from kivy.uix.videoplayer import VideoPlayer - - -class MediaPopupVideoPlayer(VideoPlayer): - def __init__(self, **kwargs): - super().__init__(**kwargs) - # FIXME: find way to make fullscreen stable - # - self.allow_fullscreen = False - - def on_fullscreen(self, instance, value): - super().on_fullscreen(instance, value) - # self.state = "pause" diff --git a/fastanime/gui/View/components/media_card/components/media_popup.kv b/fastanime/gui/View/components/media_card/components/media_popup.kv deleted file mode 100644 index 87ebcd5..0000000 --- a/fastanime/gui/View/components/media_card/components/media_popup.kv +++ /dev/null @@ -1,174 +0,0 @@ -#:import get_hex_from_color kivy.utils.get_hex_from_color -#:set yellow [.9,.9,0,.9] - -: - shorten:True - shorten_from:"right" - adaptive_height:True - - - adaptive_height:True -