Files
FastAnime/fastanime/Controller/home_screen.py
Benex254 f8e073867a feat(home screen): implement load more anime functionality to improve start up time
This feature only gets anime of a particular category and only preloads
trending category
2024-08-05 09:46:57 +03:00

144 lines
6.1 KiB
Python

from inspect import isgenerator
from kivy.clock import Clock
from kivy.logger import Logger
from ..Model import HomeScreenModel
from ..Utility import show_notification
from ..View import HomeScreenView
from ..View.components import MediaCardsContainer
# 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 = []