From d458085a4d330130a4f2ab2ecba1b4d1bce7ee24 Mon Sep 17 00:00:00 2001 From: Benex254 Date: Mon, 5 Aug 2024 09:47:05 +0300 Subject: [PATCH] fix: correct typing issues --- fastanime/cli/commands/anilist/completed.py | 2 +- fastanime/cli/commands/anilist/dropped.py | 2 +- fastanime/cli/commands/anilist/notifier.py | 19 ++++++-- fastanime/cli/commands/anilist/paused.py | 2 +- fastanime/cli/commands/anilist/planning.py | 2 +- fastanime/cli/commands/anilist/rewatching.py | 2 +- fastanime/cli/commands/anilist/watching.py | 2 +- .../cli/interfaces/anilist_interfaces.py | 4 +- fastanime/libs/anilist/anilist_data_schema.py | 47 +++++++++++++++++++ fastanime/libs/anilist/api.py | 38 +++++++-------- 10 files changed, 90 insertions(+), 30 deletions(-) diff --git a/fastanime/cli/commands/anilist/completed.py b/fastanime/cli/commands/anilist/completed.py index 9274cbb..80e09ef 100644 --- a/fastanime/cli/commands/anilist/completed.py +++ b/fastanime/cli/commands/anilist/completed.py @@ -15,7 +15,7 @@ def completed(config: Config): print("Please run: fastanime anilist loggin") exit_app() anime_list = AniList.get_anime_list("COMPLETED") - if not anime_list: + if not anime_list or not anime_list[1]: return if not anime_list[0]: return diff --git a/fastanime/cli/commands/anilist/dropped.py b/fastanime/cli/commands/anilist/dropped.py index 7bee2ce..0844916 100644 --- a/fastanime/cli/commands/anilist/dropped.py +++ b/fastanime/cli/commands/anilist/dropped.py @@ -17,7 +17,7 @@ def dropped(config: Config): anime_list = AniList.get_anime_list("DROPPED") if not anime_list: return - if not anime_list[0]: + if not anime_list[0] or not anime_list[1]: return media = [ mediaListItem["media"] diff --git a/fastanime/cli/commands/anilist/notifier.py b/fastanime/cli/commands/anilist/notifier.py index c3e710f..4bfdbef 100644 --- a/fastanime/cli/commands/anilist/notifier.py +++ b/fastanime/cli/commands/anilist/notifier.py @@ -12,6 +12,7 @@ from ....constants import ( APP_CACHE_DIR, APP_DATA_DIR, APP_NAME, + ICON_PATH, NOTIFICATION_BELL, PLATFORM, ) @@ -27,6 +28,7 @@ def notifier(config: Config): notified = os.path.join(APP_DATA_DIR, "last_notification.json") anime_image = os.path.join(APP_CACHE_DIR, "notification_image") notification_duration = config.notification_duration * 60 + app_icon = "" if not config.user: print("Not Authenticated") @@ -55,6 +57,15 @@ def notifier(config: Config): time.sleep(timeout * 60) continue data = result[1] + if not data: + print(result) + logger.warning( + "Something went wrong this could mean anilist is down or you have lost internet connection" + ) + logger.info("sleeping...") + time.sleep(timeout * 60) + continue + # pyright:ignore notifications = data["data"]["Page"]["notifications"] if not notifications: @@ -86,7 +97,9 @@ def notifier(config: Config): if resp.status_code == 200: with open(anime_image, "wb") as f: f.write(resp.content) - ICON_PATH = anime_image + app_icon = anime_image + else: + app_icon = ICON_PATH past_notifications[f"{id}"] = notification_["episode"] with open(notified, "w") as f: @@ -96,9 +109,9 @@ def notifier(config: Config): title=title, message=message, app_name=APP_NAME, - app_icon=ICON_PATH, + app_icon=app_icon, hints={ - "image-path": ICON_PATH, + "image-path": app_icon, "sound-file": NOTIFICATION_BELL, }, timeout=notification_duration, diff --git a/fastanime/cli/commands/anilist/paused.py b/fastanime/cli/commands/anilist/paused.py index 4072a7a..1b6c477 100644 --- a/fastanime/cli/commands/anilist/paused.py +++ b/fastanime/cli/commands/anilist/paused.py @@ -17,7 +17,7 @@ def paused(config: Config): anime_list = AniList.get_anime_list("PAUSED") if not anime_list: return - if not anime_list[0]: + if not anime_list[0] or not anime_list[1]: return media = [ mediaListItem["media"] diff --git a/fastanime/cli/commands/anilist/planning.py b/fastanime/cli/commands/anilist/planning.py index b200068..b76ea14 100644 --- a/fastanime/cli/commands/anilist/planning.py +++ b/fastanime/cli/commands/anilist/planning.py @@ -17,7 +17,7 @@ def planning(config: Config): anime_list = AniList.get_anime_list("PLANNING") if not anime_list: return - if not anime_list[0]: + if not anime_list[0] or not anime_list[1]: return media = [ mediaListItem["media"] diff --git a/fastanime/cli/commands/anilist/rewatching.py b/fastanime/cli/commands/anilist/rewatching.py index 9460c6e..ccb5242 100644 --- a/fastanime/cli/commands/anilist/rewatching.py +++ b/fastanime/cli/commands/anilist/rewatching.py @@ -17,7 +17,7 @@ def rewatching(config: Config): anime_list = AniList.get_anime_list("REPEATING") if not anime_list: return - if not anime_list[0]: + if not anime_list[0] or not anime_list[1]: return media = [ mediaListItem["media"] diff --git a/fastanime/cli/commands/anilist/watching.py b/fastanime/cli/commands/anilist/watching.py index 924c9e5..5c0abda 100644 --- a/fastanime/cli/commands/anilist/watching.py +++ b/fastanime/cli/commands/anilist/watching.py @@ -17,7 +17,7 @@ def watching(config: Config): anime_list = AniList.get_anime_list("CURRENT") if not anime_list: return - if not anime_list[0]: + if not anime_list[0] or not anime_list[1]: return media = [ mediaListItem["media"] diff --git a/fastanime/cli/interfaces/anilist_interfaces.py b/fastanime/cli/interfaces/anilist_interfaces.py index e9cdea7..338a303 100644 --- a/fastanime/cli/interfaces/anilist_interfaces.py +++ b/fastanime/cli/interfaces/anilist_interfaces.py @@ -586,7 +586,7 @@ def anilist_options(config, anilist_config: QueryDict): default=False, ): success, data = AniList.delete_medialist_entry(selected_anime["id"]) - if not success: + if not success or not data: print("Failed to delete", data) elif not data.get("deleted"): print("Failed to delete", data) @@ -800,7 +800,7 @@ def handle_animelist(anilist_config, config: Config, list_type: str): exit(1) anilist(config, anilist_config) return - if not anime_list[0]: + if not anime_list[0] or not anime_list[1]: print("Sth went wrong", anime_list) if not config.use_rofi: input("Enter to continue") diff --git a/fastanime/libs/anilist/anilist_data_schema.py b/fastanime/libs/anilist/anilist_data_schema.py index 7e51486..79347fa 100644 --- a/fastanime/libs/anilist/anilist_data_schema.py +++ b/fastanime/libs/anilist/anilist_data_schema.py @@ -165,3 +165,50 @@ class AnilistPages(TypedDict): class AnilistDataSchema(TypedDict): data: AnilistPages Error: str + + +class AnilistNotification(TypedDict): + id: int + type: str + episode: int + context: str + createdAt: str + media: AnilistBaseMediaDataSchema + + +class AnilistNotificationPage(TypedDict): + pageInfo: AnilistPageInfo + notifications: list[AnilistNotification] + + +class AnilistNotificationPages(TypedDict): + Page: AnilistNotificationPage + + +class AnilistNotifications(TypedDict): + data: AnilistNotificationPages + + +class AnilistMediaList(TypedDict): + media: AnilistBaseMediaDataSchema + status: str + progress: int + score: int + repeat: int + notes: str + startDate: AnilistDateObject + completedAt: AnilistDateObject + createdAt: str + + +class AnilistMediaListPage(TypedDict): + pageInfo: AnilistPageInfo + mediaList: list[AnilistMediaList] + + +class AnilistMediaListPages(TypedDict): + Page: AnilistMediaListPage + + +class AnilistMediaLists(TypedDict): + data: AnilistMediaListPages diff --git a/fastanime/libs/anilist/api.py b/fastanime/libs/anilist/api.py index 03f6667..8e24568 100644 --- a/fastanime/libs/anilist/api.py +++ b/fastanime/libs/anilist/api.py @@ -7,7 +7,12 @@ from typing import Literal import requests -from .anilist_data_schema import AnilistDataSchema, AnilistUser +from .anilist_data_schema import ( + AnilistDataSchema, + AnilistMediaLists, + AnilistNotifications, + AnilistUser, +) from .queries_graphql import ( airing_schedule_query, anime_characters_query, @@ -52,7 +57,9 @@ class AniListApi: self.user_id = user_info["id"] # pyright:ignore return user_info - def get_notification(self): + def get_notification( + self, + ) -> tuple[bool, AnilistNotifications] | tuple[bool, None]: return self._make_authenticated_request(notification_query) def reset_notification_count(self): @@ -77,19 +84,22 @@ class AniListApi: status: Literal[ "CURRENT", "PLANNING", "COMPLETED", "DROPPED", "PAUSED", "REPEATING" ], - ): + ) -> tuple[bool, AnilistMediaLists] | tuple[bool, None]: variables = {"status": status, "userId": self.user_id} return self._make_authenticated_request(media_list_query, variables) - def get_medialist_entry(self, mediaId: int): + def get_medialist_entry( + self, mediaId: int + ) -> tuple[bool, dict] | tuple[bool, None]: variables = {"mediaId": mediaId} return self._make_authenticated_request(get_medialist_item_query, variables) def delete_medialist_entry(self, mediaId: int): result = self.get_medialist_entry(mediaId) - if not result[0]: + data = result[1] + if not result[0] or not data: return result - id = result[1]["data"]["MediaList"]["id"] + id = data["data"]["MediaList"]["id"] variables = {"id": id} return self._make_authenticated_request(delete_list_entry_query, variables) @@ -139,26 +149,16 @@ class AniListApi: logger.warning( "Timeout has been exceeded this could mean anilist is down or you have lost internet connection" ) - return ( - False, - { - "Error": "Timeout Exceeded for connection there might be a problem with your internet or anilist is down." - }, - ) # type: ignore + return (False, None) except requests.exceptions.ConnectionError: logger.warning( "ConnectionError this could mean anilist is down or you have lost internet connection" ) + return (False, None) - return ( - False, - { - "Error": "There might be a problem with your internet or anilist is down." - }, - ) # type: ignore except Exception as e: logger.error(f"Something unexpected occured {e}") - return (False, {"Error": f"{e}"}) # type: ignore + return (False, None) # type: ignore def get_watchlist(self): variables = {"status": "CURRENT", "userId": self.user_id}